我有以下 Java 代码:Box<? extends Integer> i = new Box<Integer>(); i.set(10);
.为什么不编译?
最佳答案
下面的语句
Box<? extends Integer> box = new Box<Integer>();
表示框是协变的。因此,您可以取出东西,但不能放入东西。
如果改成下面这样
Box<? super Integer> box = new Box<Integer>();
box.set(10);
会起作用,因为它现在是逆变的,你可以把东西放进去,但不能把它们取出来。
假设您有以下内容。
class Box<T>{
T t;
void set(T t){
this.t = t;
}
T get(){
return t;
}
}
Box<? extends Integer> box1 = new Box<Integer>();
box1.set(10); // doesn't work
Integer i = box1.get(); // works
另一方面
Box<? super Integer> box2 = new Box<Integer>();
box2.set(10); // works
Integer i = box2.get(); // doesn't work
所以你想同时获取/设置,你可以简单地这样做
Box<Integer> box = new Box<Integer>();
box2.set(10); // works
Integer i = box2.get(); // works
关于java - java中的通用通配符。编译错误。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30225573/