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 Listpeut 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
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