In che modo il TipoLiteral di Guice supera la procedura di cancellazione dei tipi generici Java?Come funziona il TypeLiteral di Guice?
Funziona a meraviglia, ma come si realizza?
In che modo il TipoLiteral di Guice supera la procedura di cancellazione dei tipi generici Java?Come funziona il TypeLiteral di Guice?
Funziona a meraviglia, ma come si realizza?
Il trucco utilizzato qui è che le firme dei tipi super generici sono memorizzate in sottoclassi e quindi sopravvive alla cancellazione.
Se si crea una sottoclasse anonima new TypeLiteral<List<String>>() {}
Guice può chiamare getClass().getGenericSuperclass()
su di esso e ottenere un java.lang.reflect.ParameterizedType
su cui esiste un metodo per ottenere getActualTypeArguments()
List<String>
come un esempio di ParameterizedType
.
Da una combinazione di tipi anonimi, sottoclassi e il fatto che Java non cancella completamente TUTTE le dichiarazioni generiche.
Se si guarda da vicino il TypeLiteral ha un costruttore protetto, quindi si utilizza un ulteriore {} quando si costruisce uno nuovo che crea una sottoclasse anonima di TypeLiteral.
In Java le dichiarazioni generiche vengono mantenute su dichiarazioni di classi e metodi, quindi se scrivo questo.
public abstract class Class1<T>
{
}
public class Class2 extends Class1<Integer>
{
}
posso effettivamente scrivere codice in Class1 che può capire che il proprio tipo generico è Integer se Class2 era la sottoclasse.
Controlla l'API java.lang.Class per i metodi appropriati (hanno un nome generico nel nome).