前几天,当谈到泛型和协变/逆变时,我有点困惑。我知道 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 根本不支持正确的协方差定义?谢谢。