前几天,当涉及到泛型和协方差/逆方差时,我有点困惑。我知道C#指定了协变/逆变类型参数,但是在Java语言中真的有类似的概念吗?
我知道你可以声明:
List<? extends String> l = ...
List<? super String> l2 =...现在l可以获取MyString的列表,add方法是不允许的等等,而l2可以获取List<Object>并向其添加字符串,但不能获取任何元素,如这里所述的Covariance- contravariance in Java。然而,这只是简单地声明了一个带有接受subtyes/超类型的类型参数的列表,而不是像这样做“适当的”协方差:
Iterable<Animal> a = new Iterable<Dog>();是我搞混了,还是Java根本不支持正确的协方差定义?谢谢。
发布于 2013-03-06 12:54:24
Java的类型变化是在使用站点,而不是在声明站点。假设我们有一个类型声明
interface List<E>我们可以协变使用它(在原始语法中)
List<+Animal> animals = new ArrayList<Dog>();类型变量上的+注释使参数化类型协变。
这一点都不坏。我们也可以有对比的List<-Animal>。它更加灵活。
不幸的是,Java设计者高估了Java程序员的愚蠢,他们认为单个字母符号+/-会让我们发疯;我们必须看到英文单词才能理解到底发生了什么。在Java中,冗长仍然是值得庆祝的时刻。所以我们得到这个语法
List<? extends Animal>我认为这是绝对的智障。
https://stackoverflow.com/questions/15238997
复制相似问题