J'ai ce code, qui compile: puis j'ai essayé p> qui ne compile pas. P> Je suis nouveau à la programmation Java (venu de C #) et j'ai pensé que merci. P> p> t.class code> est un équivalent exact de
typeof (t) code> in c #. Apparemment, il y a quelque chose de très basique que je ne comprends pas, alors ma question est ce qui ne va pas avec
ArrayList
Nouveau Typeoken
4 Réponses :
Malheureusement (?) Java implémente des génériques utilisant Effacement de type .
Cela signifie qu'il n'y a pas de construction pour obtenir le type générique et à l'exécution de votre arraylist ne stocke réellement que des objets. P>
être exact, les génériques de Java sont une construction de compilation unique. Ils garantissent la sécurité de type à la compilation uniquement. P>
EDIT:
Je viens de remarquer ce bit de code - p> Il s'agit d'une solution de contournement pour les limitations de l'effacement de type. Les informations de type sont conservées si vous étendez une classe générique avec un type spécifique. Par exemple: p> dans votre exemple, vous étendez de manière tritive la classe Edit2: Pour une explication plus détaillée, consultez Reflétant des génériques . P> P> typé / code>, faisant générer le compilateur de générer une classe interne anonyme < / em> qui contient les informations de type. La mise en œuvre de
typetoken.getype () code> utilisera la réflexion pour vous donner cette information de type. P>
En fait, l'exemple que vous avez donné ci-dessus est considéré comme un modèle antérieur appelé pseudo -typedf antipattern .
@Emil Votre lien entrevoir comment il s'agit d'un anti-motif d'étendre une classe pour rendre la déclaration des génériques plus courte. Je faisais référence à Reflétant des génériques qui est différent dans un but. Merci de l'avoir pointé sur le bouton > StringList code> ne doit pas être utilisé!
Votre premier échantillon de code crée une sous-classe anonyme de Typeoken complète avec des fixations génériques concrètes. Le type retourné sera une instance de retournera false! P> dans votre deuxième échantillon de code, vous essayez de faire quelque chose que Java ne prend pas en charge à cause de la façon dont les génériques sont des génériques mis en œuvre avec effacement de type. Il n'y a pas de classe qui représente une arraylist code> dont le paramètre générique est lié ... à partir du point de vue du compilateur AN Il est possible qu'aucun code de code ne fonctionne tout à fait juste. Si vous devez jouer des classes avec des paramètres génériques, vous voudrez peut-être examiner GentyRef , Ce que j'ai trouvé très utile pour simplifier l'API de demander aux types de questions que vous essayez d'obtenir des réponses. P> P> classe code>. Mais méfiez-vous, car
ArrayList code> est une arrayliste
code> quel que soit Le type générique, de sorte que l'expression ne compile pas. P>
À propos de la construction ".class", ce n'est pas un opérateur ni un membre d'instance, il est en fait un moyen de dire à la langue "aller et de trouver l'objet de classe pour ce nom de classe avant le point". Est une façon de construire Comme spécifié dans la JLE, Section 15.8 .2 , le compilateur se plaindre si vous essayez de l'utiliser avec un type paramétré (entre autres). P>
L'exemple donné par Leader128 est considéré comme un anti-motif appelé pseudo-typledef anticipattern est l'alternative:
class TokenUtil{ public static <T> TypeToken<T> newTypeToken(){ return new TypeToken<T>(); } public static void main(String[] args) { TypeToken<ArrayList<ServerTask>> typeTok = TokenUtil.newTypeToken(); Type type = typeTok.getType(); } }
Salut Emil, l'exemple que j'ai donné n'était pas une solution, mais une explication de la manière dont les informations de type générique ne sont pas effacées si la classe enfant n'est pas générique. Veuillez consulter ce lien pour une bibliothèque implémentation du Typeoken code> Classe
qui vous permet d'obtenir des informations de type de paramètres génériques à l'aide de ce mécanisme - je soupçonne que l'OP utilise ceci ou quelque chose de similaire.