2017-10-11 2 views
0

Premièrement, pourquoi la première ligne compile-t-elle alors que la seconde ne le fait pas? Deuxièmement, dans le cas de la deuxième ligne, les deux types doivent toujours être les mêmes, par exemple Integer à gauche et Integer à droite. Ou est-il possible d'avoir différents types à gauche et à droite?ArrayList initialise avec un type de données différent

List<? super Integer> nums1 = new ArrayList<Number>(); //COMPILES 
    List<Integer> nums2 = new ArrayList<Number>();   //DOES NOT COMPILE 
+0

Qu'est-ce que vous en avez besoin? –

+0

Juste ma compréhension. Le code ne verra probablement pas la lumière du jour. – JonJavaK

+1

Je suppose que 'Number' est une super-classe de' Integer', mais n'est pas 'Integer'. – Blorgbeard

Répondre

2

Votre question est esentially un double de this SO-article mais en bref:

? super T signifie "tout ce qui est une superclasse de T". Number est une superclasse de Integer alors c'est accepté. La deuxième ligne ne fonctionne pas simplement parce que Number n'est pas Integer. Il ne fonctionnerait pas vice versa, soit

ArrayList<Number> nums2 = new ArrayList<Integer>(); 

conduit également à une erreur de compilation. Pour cela vous pouvez utiliser

ArrayList<? extends Number> nums2 = new ArrayList<Integer>(); 
+0

Puis fermez comme doublon. –

+0

@ ThorbjørnRavnAndersen Deux raisons: 1. Je ne pense pas que je peux fermer une question à moi seul et je trouve cela un peu impoli de le faire. 2. Même si l'article SO lié couvre la question ici, je considère qu'il est plus utile de répondre à la question parce qu'il est plus facile de comprendre si votre propre code est utilisé dans la réponse plutôt que de simplement pointer vers la réponse générale (qui vaut encore lire pour obtenir tous les détails) – Lothar