2013-03-06 3 views
2

На днях я немного смутился, когда речь идет о дженериках и ковариации/контравариантности. Я знаю, что 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 просто не поддерживает соответствующие определения ковариации? Благодарю.

+0

Это должно быть 'Итерируемое a = new Iterable (); 'предполагается, что' Dog extends Animal' и 'Iterable ' –

+0

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

+0

Я имел в виду Iterable точно так, если Java допускал ковариантный тип param, конечно – Bober02

ответ

-3

Разница типа Java находится на сайте использования, а не на сайте объявления. Скажем, у нас есть объявление типа

interface List<E> 

мы можем использовать его ковариантно (в оригинальном синтаксисе)

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

+ аннотация на переменном типе делает параметризированные типа ковариант.

Это совсем не плохо. У нас может быть и контрастный List<-Animal>. Он более гибкий.

UNFORTUNATELY, дизайнеры Java переоценили глупость Java-программистов, они думают, что символ одной буквы +/- нас сведёт с ума; что мы должны увидеть английские слова, чтобы понять, что происходит. И на Java все еще было время, чтобы многословность была отмечена. Таким образом, мы получаем этот синтаксис

List<? extends Animal> 

Я думаю, что это абсолютно запаздывает.