Comment TypeLiteral de Guice la procédure d'surmonter l'effacement Java types génériques?Comment fonctionne TypeLiteral de Guice?
Il fonctionne à merveille, mais comment cela est accompli?
Comment TypeLiteral de Guice la procédure d'surmonter l'effacement Java types génériques?Comment fonctionne TypeLiteral de Guice?
Il fonctionne à merveille, mais comment cela est accompli?
L'astuce qui est utilisée ici est que les signatures des super types génériques sont stockées dans des sous-classes et donc survivre à l'effacement.
Si vous créez une sous-classe anonyme new TypeLiteral<List<String>>() {}
Guice peut appeler getClass().getGenericSuperclass()
sur et obtenir un java.lang.reflect.ParameterizedType
sur lequel existe une méthode getActualTypeArguments()
pour obtenir List<String>
comme une instance de ParameterizedType
.
Par une combinaison de types anonymes, subclassing et le fait que Java ne supprime pas complètement toutes les déclarations génériques. Si vous regardez attentivement le TypeLiteral a un constructeur protégé ainsi vous employez un {} supplémentaire en construisant un nouveau qui crée une sous-classe anonyme de TypeLiteral.
Dans Java déclarations génériques sont conservés sur les déclarations de classe et méthode, donc si j'écris ceci.
public abstract class Class1<T>
{
}
public class Class2 extends Class1<Integer>
{
}
Je peux réellement écrire du code dans Class1 qui peut comprendre que son propre type générique est entier si Classe2 était la sous-classe.
Vérifiez la API java.lang.Class pour les méthodes appropriées (ils ont générique dans le nom).