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);