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

标签 java generics wildcard

我有以下 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/

相关文章:

mysql - 如何忽略 MYSQL SELECT LIKE %...% 上的字符

java - 迭代器无法再次迭代

java - 主线程优先级的值是多少?

java - birt 报告中的嵌套循环

go - 接口(interface)的泛型和非泛型使用有什么区别?

android - rawQuery 通配符 `"_"` 不工作

java - Java中 boolean 变量的大小是多少?

java - 如何确定 Java 中泛型字段的类型?

C# 将泛型列表传递给方法,然后转换为类型

java - 在 Java 中转换泛型列表