虽然 learning Java generics 我开始知道使用协变我们可以从一个结构中读取项目,但我们不能向它写入任何内容,而使用逆变我们可以将项目写入一个结构,但我们不能从中读取任何内容。

让我们举个例子:

List<? extends Number> myNums = new ArrayList<Integer>();
myNums.add(45L); // Covariance - compiler error
List<? super Integer> myNums = new ArrayList<Integer>();
myNums.add(1);
Number myNum = myNums.get(0); //Contravariance - compiler-error

我无法理解的是为什么禁止这件事?如果允许这件事发生,我无法理解会出现什么问题?

最佳答案

您不能将 Integer 类的元素添加到 List<? extends Number> 中,因为您不知道列表中元素的确切类型。它实际上可能是 List<Double> 。下一个示例中的逻辑相同。你从 List<? super Integer> 得到的可能是 Object 类型,而不是 Number

关于java - Java泛型中的协变和逆变中的读写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42874317/

10-10 21:51
查看更多