2013-03-06 1 views
2

J'ai été un peu confus l'autre jour en ce qui concerne les génériques et la covariance/contravariance. Je sais que C# spécifie des paramètres de type covariant/contravariant, mais y a-t-il vraiment un concept similaire en Java?Java - la covariance et la contravariance existent-elles?

Je comprends que vous pouvez déclarer:

List<? extends String> l = ... 
List<? super String> l2 =... 

et maintenant je peux prendre la liste des MyString, la méthode add n'est pas autorisé, etc. tandis que l2 peuvent prendre List<Object> et ajoute la chaîne à, mais ne peut obtenir aucun élément, comme décrit ici Covariance- contravariance in Java. Ceci, cependant, est en déclarant simplement une liste avec un paramètre de type qui accepte subtyes/supertypes, ne pas faire covariance « bon » comme:

Iterable<Animal> a = new Iterable<Dog>(); 

Suis-je confus ou ne prennent pas en charge Java simplement des définitions de covariance appropriées? Merci.

+0

Il devrait être 'Iterable a = new Iterable (); 'en supposant que' Dog étend Animal' et 'Iterable ' –

+0

Oui - http://stackoverflow.com/questions/2501023/demonstrate-covariance-and-contravariance-in-java – djechlin

+0

Je voulais dire l'Iterable exactement comme ça, si Java a permis covariant type param bien sûr – Bober02

Répondre

-3

La variance de type Java se trouve sur le site d'utilisation et non sur le site de déclaration. Disons que nous avons une déclaration de type

interface List<E> 

nous pouvons l'utiliser covariante (dans la syntaxe originale)

List<+Animal> animals = new ArrayList<Dog>(); 

l'annotation + sur la variable de type rend le covariant de type paramétrées.

Ce n'est pas mal du tout. Nous pouvons avoir List<-Animal> aussi. C'est plus flexible. Malheureusement, les concepteurs de Java ont surestimé la stupidité des programmeurs Java, ils pensent que le symbole de lettre unique +/- nous rendra fous; que nous devons voir des mots anglais pour comprendre ce qui se passe. Et il était encore temps à Java que la verbosité soit célébrée. Nous obtenons donc cette syntaxe

List<? extends Animal> 

Je pense qu'il est absolument retardé.

Questions connexes