Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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 - Fatal编程技术网

Java 通配符参数化不接受对象-为什么?

Java 通配符参数化不接受对象-为什么?,java,generics,Java,Generics,以下示例取自 对于编译器的类型检查器,Box与Box不同。一个框肯定会包含一个对象,所以调用put(object)就可以了。框的类型参数未知。Unknown不同于对象 例如,它可以是Integer。在框上调用put(Object)将是一个错误。如果编译器接受,则您可以将程序修改为: Box<?> box = new Box<Integer>(1); Object o = new Object(); box.put(o); Box-Box=新框(1); 对象o=新对象()

以下示例取自


对于编译器的类型检查器,
Box
Box
不同。一个
肯定会包含一个对象,所以调用
put(object)
就可以了。
的类型参数未知。Unknown不同于
对象

例如,它可以是
Integer
。在
框上调用
put(Object)
将是一个错误。如果编译器接受,则您可以将程序修改为:

Box<?> box = new Box<Integer>(1);
Object o = new Object();
box.put(o);
Box-Box=新框(1);
对象o=新对象();
盒子。放入(o);
并且有一个非常明显的类型不匹配。允许编译最后一行只会将错误推迟到运行时

换句话说,泛型类型擦除并不意味着编译器在编译时不知道泛型类型。它尽最大努力在信息被删除之前发现错误

public class Box
{

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

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

    public Object take()
    {
        return t;
    }

    public static void main(String args[])
    {
        Box box = new Box(new Object());
        Object o = new Object();
        o = box.take();
    }

    private Object t;
}
Box<?> box = new Box<Integer>(1);
Object o = new Object();
box.put(o);