<分区>
我最近在学习 Java 泛型,并且只是想通过“Java 泛型常见问题解答”。
下面关于通配符参数化类型的问题 (#304) 让我有点困惑,希望得到你的帮助。
代码示例:
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 boolean equalTo(Box<T> other) { return this.t.equals(other.t); }
public Box<T> copy() { return new Box<T>(t); }
}
class Test {
public static void main(String[] args) {
Box<?> box = new Box<String>("abc");
box.put("xyz"); // error
box.put(null); // ok
String s = box.take(); // error
Object o = box.take(); // ok
boolean equal = box.equalTo(box); // error {confused}
equal = box.equalTo(new Box<String>("abc")); // error {confused}
Box<?> box1 = box.copy(); // ok
Box<String> box2 = box.copy(); // error
}
}
无法弄清楚为什么调用下面两个方法会失败:
boolean equal = box.equalTo(box);
equal = box.equalTo(new Box<String>("abc"));
谢谢