Следующий пример взято из Generics FAQ.Подстановочный знак, параметризованный не принимающий объект -why?
public class Box<T> {
private T t;
public Box(T t) {
this.t = t;
}
public void put(T t) {
this.t = t;
}
public T take() {
return t;
}
public static void main(String[] args) {
Box<?> box = new Box<Object>(new Object());
Object o = new Object();
box.put(o); // Compiler error
o = box.take(); // ok
}
}
Если вы посмотрите на декомпилированную версию put() принимает объект. Итак, почему компилятор не принимает Object в put()?
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;
}