我有以下java代码:Box<? extends Integer> i = new Box<Integer>(); i.set(10);
。为什么不编译?
答案 0 :(得分:3)
以下陈述
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
答案 1 :(得分:2)
因为Box<? extends Integer>
可以是Box<SomeSubtypeOfIntegerNotIncluding10>
。您需要Box<Integer>
代替。