Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用对象作为无界通配符引用对象的参数_Java_Generics_Unbounded Wildcard - Fatal编程技术网

Java 使用对象作为无界通配符引用对象的参数

Java 使用对象作为无界通配符引用对象的参数,java,generics,unbounded-wildcard,Java,Generics,Unbounded Wildcard,简单类: class Box<T> { private T t; public Box(T t) { this.t = t; } public void put(T t) { this.t = t; } } 类框{ 私人T; 公用信箱(T){ t=t; } 公开作废认沽权(T){ t=t; } } 正在尝试执行传递对象实例的put()方法 Box<?> box = new Box<Str

简单类:

class Box<T> {
    private T t;

    public Box(T t) {
        this.t = t;
    }

    public void put(T t) {
        this.t = t;
    }
}
类框{
私人T;
公用信箱(T){
t=t;
}
公开作废认沽权(T){
t=t;
}
}
正在尝试执行传递对象实例的put()方法

Box<?> box = new Box<String>("abc");
box.put(new Object());
Box-Box=新框(“abc”);
放置(新对象());
编译器指出一个错误:

The method put(capture#1-of ?) in the type Box<capture#1-of ?> is not applicable for the arguments (Object)
类型框中的方法put(capture#1-of?)不适用于参数(对象)
事实上,编译器不知道应该使用什么类型,但有一点是肯定的——它将是一个对象或它的子类。那么为什么会出现错误呢


谢谢你

你的例子清楚地解释了原因

框的实际类型是
box
。所以你真的不想把字符串实例以外的东西放到这个框中

Box
的意思是:“编译器不知道的某种类型的框”。因此,您可以从这样一个框中获得任何您想要的内容,并且您可以获得对象实例,但您不能将任何内容存储到该框中,因为编译器无法保证您存储的对象具有适当的类型:

class Box<T> {
    private T t;

    public Box(T t) {
        this.t = t;
    }

    public void put(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}

Box<?> box = new Box<String>("abc");
Object o = box.get(); // no problem
box.put(new Object()); // fail
类框{
私人T;
公用信箱(T){
t=t;
}
公开作废认沽权(T){
t=t;
}
公共部门得不到{
返回t;
}
}
盒子=新盒子(“abc”);
对象o=box.get();//没问题
box.put(新对象());//失败
泛型的目标是使代码类型安全。如果您可以将任意对象添加到实际上是
框的框中,您将不再具有任何类型安全性。

声明:

Collection<?> c = new ArrayList<String>();
c.add(new Object()); // Same compile time error as yours
Collection c=newarraylist();
c、 添加(新对象());//与您的编译时错误相同
“因为我们不知道c的元素类型代表什么,所以我们不能向它添加对象方法接受类型为E的参数,即集合的元素类型。当实际类型参数为?时,它表示某个未知类型。我们传递要添加的任何参数都必须是此未知类型的子类型。因为我们不知道这是什么类型,所以无法传递任何内容。唯一的例外是null,它是每个类型的成员。

另一方面,给定一个列表,我们可以调用get()并使用结果。结果类型是未知类型,但我们始终知道它是一个对象。因此,将get()的结果指定给object类型的变量或将其作为参数传递给预期类型对象的位置是安全的。”

为了解释,基本上可以调用get()返回类型,但不能添加,因为编译器不知道它是什么类型,而传递的参数需要扩展未知类型