java中的通用通配符。编译错误。

时间:2015-05-13 21:34:42

标签: java generics wildcard

我有以下java代码:Box<? extends Integer> i = new Box<Integer>(); i.set(10);。为什么不编译?

2 个答案:

答案 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>代替。