На днях я немного смутился, когда речь идет о дженериках и ковариации/контравариантности. Я знаю, что C# задает параметры ковариантного/контравариантного типа, но действительно ли существует аналогичная концепция в Java?Java - существуют ли ковариация и контравариантность?
Я понимаю, что вы можете объявить:
List<? extends String> l = ...
List<? super String> l2 =...
и теперь я смогу взять список из MyString
, добавить метод не допускается и т.д., а l2 может принять List<Object>
и добавить строку к нему, но не может получить какой-либо элемент, как описано здесь Covariance- contravariance in Java. Это, однако, просто объявить список с параметром типа, который принимает subtyes/супертипы, не делает «правильные» ковариации как:
Iterable<Animal> a = new Iterable<Dog>();
ли я спутать или же Java просто не поддерживает соответствующие определения ковариации? Благодарю.
Это должно быть 'Итерируемое extends Animal> a = new Iterable(); 'предполагается, что' Dog extends Animal' и 'Iterable ' –
Да - http://stackoverflow.com/questions/2501023/demonstrate-covariance-and-contravariance-in-java – djechlin
Я имел в виду Iterable точно так, если Java допускал ковариантный тип param, конечно – Bober02