2

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

我了解您可以声明:

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

现在 l 可以获取列表MyString,不允许添加方法等。而 l2 可以获取List<Object>并向其添加 String,但无法获取任何元素,如此处所述Covariance- contravariance in Java。然而,这只是简单地声明一个带有接受子类型/超类型的类型参数的 List,而不是执行“适当的”协方差,例如:

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

我感到困惑还是 Java 根本不支持正确的协方差定义?谢谢。

4

1 回答 1

-2

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

interface List<E>

我们可以协变地使用它(在原始语法中)

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

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

这一点也不坏。我们也可以有逆反List<-Animal>。它更灵活。

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

List<? extends Animal>

我认为它绝对是迟钝的。

于 2013-03-06T04:54:24.420 回答