Arriver T.class en dépit de Java type-erasure
Je suis en train de le lier à une interface à sa mise en œuvre en lecture à partir d'un fichier de configuration de sorte que je peux donner à manger à mes conteneur IoC. Voici à peu près ce que j'essaie de faire:
public class PropertyImplementationBinder<T> {
//...
public Class getInterfaceClass() {
return T.class; //OR Class<T>, note T is not newable
}
public Class getImplementationClass() {
return /* read config file to get implementation class */;
}
}
Est en quelque sorte possible d'obtenir T.class
?
- celui-ci semble plus élégant
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de transmettre explicitement la classe dans le constructeur (et rangez-le vous-même).
Vous pouvez obtenir le type réel des arguments pour un générique super-classe d'une classe. Cette post de blog explore les possibilités offertes par ce, y compris un petit truc agréable à l'aide de trivial anonyme intérieur des classes. Pour citer directement:
Contrairement à ce qui est largement accepté et rarement connue type d'effacement peut être évité, ce qui signifie que le destinataire de l'appel ne avoir la capacité de savoir qui des paramètres génériques ont été employées au cours de l'appel.
Veuillez jeter un oeil à:
À l'aide de TypeTokens pour récupérer les paramètres génériques
L'article parle également de l'expérience de nos utilisateurs avec la technique. En bref, nous avons fini par revenir à la...
Classique et technique largement utilisée: "Pass types de classe dans les constructeurs"
Btw. L'exemple statique de la méthode getType dans l'article de @Richard Gomes a deux erreurs. il devrait aller comme ça:
Malheureusement il n'est toujours pas la panacée, car il fonctionne si vous avez explicitement dans le code
mais si vous appelez cela sur quelque chose comme
Juste le nom de T.
TypeVariable.getGenericDeclaration()
est une Classe. Il faut beaucoup de travail à plein le type réel des arguments dans tous les cas (surtout si elles sont définies par une super-classe, il y a plusieurs paramètres de type, etc. mais j'ai écrit le code pour le faire.Non, il n'est pas possible.
La seule exception à Java de type de l'effacement, c'est que par réflexion, vous pouvez trouver le type paramétré par réflexion sur une classe de champs.