Pourquoi List n’est pas acceptable en tant que List ?

Considérez ci-dessous la méthode doSomething(List) qui accepte List tant que paramètre.

 private void doSomething(List list) { // do something } 

Maintenant, considérons l’extrait de code ci-dessous qui essaie d’appeler doSomething() où j’essaie de passer List à doSomething()

 List objectList; List ssortingngList; doSomething(ssortingngList); // compilation error incompatible types doSomething(objectList); // works fine 

Même en dessous du code, une erreur de compilation est générée

 objectList = ssortingngList; // compilation error incompatible types 

Ma question est pourquoi List ne peut pas être passé à une méthode qui accepte List ?

Cette question générique en Java peut paraître déroutante pour ceux qui ne sont pas très familiarisés avec les génériques car, à première vue, il ressemble à Ssortingng est un object. List peut être utilisé là où List est requirejs, mais ce n’est pas vrai. Cela entraînera une erreur de compilation.

Cela va de soi si vous allez plus loin, car List peut tout stocker, y compris Ssortingng , Integer etc., mais List ne peut stocker que des Ssortingngs .

Regardez aussi: Pourquoi ne pas hériter de List ?

Alors que Ssortingng étend l’ Object , List ne s’étend pas List

Mettre à jour:
En général, si Foo est un sous-type (sous-classe ou sous-interface) de Bar et que G est une déclaration de type générique, il n’est pas vrai que G est un sous-type de G .

C’est parce que les collections changent. Dans votre cas, Si List était un sous-type de List , des types autres que Ssortingng peuvent y être ajoutés lorsque la liste est référencée à l’aide de son supertype, comme suit:

 List ssortingngList = new ArrayList; List objectList = ssortingngList;// this does comstack only if List where subtypes of List objectList.add(new Object()); Ssortingng s = ssortingngList.get(0);// attempt to assign an Object to a Ssortingng :O 

et le compilateur Java doit empêcher ces cas.

Plus de détails sur cette page du tutoriel Java.

Vous pouvez mettre un object d’un type incorrect dans la liste SI cela fonctionne:

 private void doSomething(List list) { list.add(new Integer(123)); // Should be fine, it's an object } List ssortingngList = new ArrayList(); doSomething(ssortingngList); // If this worked.... Ssortingng s = ssortingngList.get(0); // ... you'd receive a ClassCastException here 

La raison de ces limitations est liée aux considérations de variance.

Prenez le code suivant:

 public void doSomething(List objects) { objects.add(new Object()); } 

En développant votre exemple, vous pouvez essayer de procéder comme suit:

 List ssortingngs = new ArrayList(); ssortingng.add("S1"); doSomething(ssortingngs); for (Ssortingng s : ssortingngs) { System.out.println(s.length); } 

Espérons que la raison de cette situation soit évidente si le compilateur permettait la compilation de ce code (ce qui n’est pas le cas): une ClassCastException se produirait pour le deuxième élément de la liste lors de la tentative de conversion de l’ Object en Ssortingng .

Pour pouvoir passer des types de collection généralisés, vous devez procéder comme suit:

 public void doSomething(List objects) { for (Object obj : objects) { System.out.println(obj.toSsortingng); } } 

Encore une fois, le compilateur surveille votre dos et si vous deviez remplacer System.out par objects.add(new Object()) le compilateur ne le permettrait pas car des objects auraient pu être créés sous la forme List .

Pour plus d’informations sur la variance, voir la covariance et la contre- variabilité de Wikipedia

On s’attend parfois à ce qu’un List soit un supertype de List , car Object est un supertype de Ssortingng .

Cette attente provient du fait qu’une telle relation de type existe pour les tableaux:

Object[] est un supertype de Ssortingng[] , car Object est un supertype de Ssortingng . (Cette relation de type est connue sous le nom de covariance.)

La relation de super-sous-type des types de composant s’étend aux types de tableau correspondants.

Aucune relation de type de ce type n’existe pour les instanciations de types génériques. (Les types paramétrés ne sont pas covariants.)

Vérifiez ici pour plus de détails

De Java Tutorials of Generics:

Testons votre compréhension des génériques. L’extrait de code suivant est-il légal?

 List ls = new ArrayList(); // 1 List lo = ls; // 2 

La ligne 1 est certainement légale. La partie la plus délicate de la question est la ligne 2. Cela se résume à la question: est-il une liste de chaînes, une liste d’objects. La plupart des gens répondent instinctivement: “Bien sûr!”

Eh bien, jetez un oeil aux lignes suivantes:

 lo.add(new Object()); // 3 Ssortingng s = ls.get(0); // 4: Attempts to assign an Object to a Ssortingng! 

Ici, nous avons aliasé ls et lo. En accédant à ls, une liste de Ssortingng, à travers l’alias lo, nous pouvons y insérer des objects arbitraires. En conséquence, ls ne détient plus que des chaînes, et lorsque nous essayons d’en tirer quelque chose, nous avons une mauvaise surprise.

Le compilateur Java empêchera bien sûr que cela se produise. La ligne 2 provoquera une erreur de compilation.

Source: Génériques et sous-typage

Si vous n’êtes pas sûr du type de données, vous pouvez utiliser Generics dans Java comme suit:

 public static void doSomething(List data) { } public static void main(Ssortingng [] args) { List objectList = new ArrayList(); List ssortingngList = new ArrayList(); doSomething(objectList); doSomething(ssortingngList); } 

Mais lors de l’utilisation des données, vous devrez spécifier le type de données approprié en tant que type Cast