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.
Il devrait être 'Iterable extends Animal> a = new Iterable(); 'en supposant que' Dog étend Animal' et 'Iterable ' –
Oui - http://stackoverflow.com/questions/2501023/demonstrate-covariance-and-contravariance-in-java – djechlin
Je voulais dire l'Iterable exactement comme ça, si Java a permis covariant type param bien sûr – Bober02