我这样声明集合
List<? extends Number> ml = new Vector<Integer>();
我尝试添加元素
无效:
ml.add(new Integer(1));
这也太
ml.add(new Object());
我很困惑。如何使用 ml
?
最佳答案
列表不是协变的。如果您使用? extends Number
那么你只能从列表中读取,不能写入。为什么不呢?
m1.add(new Object());
为什么这不起作用应该是显而易见的。该列表应该包含 Number
和一个Object
不是Number
.
ml.add(new Integer(1));
这个不太明显。想象一下您有 m1
的不同实例。 :
List<? extends Number> ml = new Vector<Double>();
ml.add(new Integer(1));
现在m1
是 double vector 。向该列表添加整数是非法的。编译器通常不知道 ? extends Number
的具体类型是什么。是。保守地说,它不允许调用 add
完全方法。您可以遍历列表并读取其中的内容,也可以从中删除项目,但不能向其中添加新项目。
或者换句话说,对于 List<E>
您可以调用返回 E
的方法但你不能调用那些需要 E
的作为参数。
关于java - 我可以用像 List< 这样的相同泛型做什么? ...>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22156690/