Java - 存在协方差和逆变吗?

时间:2013-03-06 04:27:49

标签: java generics covariance contravariance

前几天,当谈到泛型和协方差/逆变时,我有点困惑。我知道C#指定了协变/逆变类型参数,但Java中是否存在类似的概念?

我知道你可以声明:

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

现在我可以获取MyString列表,不允许添加方法等,而l2可以使用List<Object>并向其添加String,但不能获取任何元素,如此处所述{{3 }}。但是,这只是声明一个带有类型参数的List,它接受子类型/超类型,而不是做“正确”的协方差,如:

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

我是否感到困惑,或者Java是否不支持正确的协方差定义?感谢。

1 个答案:

答案 0 :(得分:-2)

Java的类型差异在使用站点,而不是在声明站点。假设我们有一个类型声明

interface List<E>

我们可以共同使用它(原始语法)

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

类型变量上的+注释使参数化类型变形。

这一点都不差。我们也可以反对List<-Animal>。它更灵活。

不幸的是,Java设计师高估了Java程序员的愚蠢,他们认为单字母符号+/-会让我们发疯;我们必须看到英语单词以了解正在发生的事情。现在仍然是Java的时候要庆祝冗长。所以我们得到这个语法

List<? extends Animal>

我认为它绝对是迟钝的。