虽然 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/