前几天,当谈到泛型和协方差/逆变时,我有点困惑。我知道C#指定了协变/逆变类型参数,但Java中是否存在类似的概念?
我知道你可以声明:
List<? extends String> l = ...
List<? super String> l2 =...
现在我可以获取MyString
列表,不允许添加方法等,而l2可以使用List<Object>
并向其添加String,但不能获取任何元素,如此处所述{{3 }}。但是,这只是声明一个带有类型参数的List,它接受子类型/超类型,而不是做“正确”的协方差,如:
Iterable<Animal> a = new Iterable<Dog>();
我是否感到困惑,或者Java是否不支持正确的协方差定义?感谢。
答案 0 :(得分:-2)
Java的类型差异在使用站点,而不是在声明站点。假设我们有一个类型声明
interface List<E>
我们可以共同使用它(原始语法)
List<+Animal> animals = new ArrayList<Dog>();
类型变量上的+
注释使参数化类型变形。
这一点都不差。我们也可以反对List<-Animal>
。它更灵活。
不幸的是,Java设计师高估了Java程序员的愚蠢,他们认为单字母符号+/-会让我们发疯;我们必须看到英语单词以了解正在发生的事情。现在仍然是Java的时候要庆祝冗长。所以我们得到这个语法
List<? extends Animal>
我认为它绝对是迟钝的。