Java Générique List<List<? s'étend Nombre>>
Comment venir en java on ne peut pas faire:
List<List<? extends Number>> aList = new ArrayList<List<Number>>();
Même si c'est OK:
List<? extends Number> aList = new ArrayList<Number>();
Compilateur message d'erreur est:
Type mismatch: cannot convert from ArrayList<List<Number>> to List<List<? extends Number>>
Vous devez vous connecter pour publier un commentaire.
En Java, si
Car
est une classe dérivée deVehicle
, alors nous pouvons traiter toutes lesCars
commeVehicles
; unCar
est unVehicle
. Cependant, unList
deCars
n'est pas unList
deVehicles
. Nous disons queList<Car>
est pas covariante avecList<Vehicle>
.Java vous oblige à indiquer explicitement lorsque vous souhaitez utiliser la covariance et la contravariance avec des caractères génériques, représentée par le
?
jeton. Jetez un oeil à où votre problème se pose:L'intérieur
List<? extends Number>
fonctionne parce queNumber
en effet, d'étendreNumber
, de sorte qu'il correspond à "? extends Number
". Pour l'instant, donc bon. Quelle est la prochaine?Cependant, la combinaison intérieure paramètre de type
List<? extends Number>
n'est pas compensée parList<Number>
; les types doivent être exactement identiques. Un autre joker dira Java que ce type doit également être covariants:Je ne suis pas très familier avec la syntaxe Java, mais il semble que votre question est: est-ce
La Covariance et la Contravariance
Vous devriez certainement utiliser l' ? type générique lorsque cela est approprié, ne pas éviter, en règle générale. Par exemple:
vous permet de passer un
List<Integer>
ou unList<Long>
.permet de passer des arguments a déclaré que
List<Number>
. Une petite distinction, oui, mais en utilisant le caractère générique est puissant et sûr. Contrairement à la façon dont il peut sembler, uneList<Integer>
n'est pas une sous-classe, ou n'est pas cessible, deList<Number>
. NiList<Integer>
une sous-classe deList<? extends Number
, c'est pourquoi le code ci-dessus ne compile pas.Votre déclaration ne compile pas car
List<? extends Number>
n'est pas du même type queList<Number>
. Le premier est un supertype de ce dernier.Avez-vous essayé? Ici, je suis en exprimant que la Liste est covariant dans son argument de type, de sorte qu'il accepte n'importe quel sous-type de
List<? extends Number>
(qui comprendList<Number>
).Ou même ce. Ici, le paramètre de type de la liste de tableaux sur le côté droit est le même que le paramètre type sur le côté gauche, de sorte que la variance n'est pas un problème.
Vous devriez être en mesure de dire simplement
J'ai tendance à éviter les
?
type génériques chaque fois que possible. Je trouve que les frais engagés dans le type d'annotation n'est pas la peine de la prestation.