这里发生了什么以及如何理解它?
class C<T> {
public T id(T x) {
return null;
}
}
class D extends C<String> {
public Integer id(Integer x) { // compiles! but T shall be String ???
return 7;
}
}
public static void main(String[] args) {
System.out.println(new D().id("7")); // null
System.out.println(new D().id(7)); // 7
}
顺便说一句,如果我像这样声明D,则编译会因Name clash: The method id(Object) of type D has the same erasure as id(T) of type C<T> but does not override it:
class D extends C<String> {
public Object id(Object x) { // compile error !
return 7;
}
}
答案 0 :(得分:3)
编译器检查到它们已被正确使用后,编译器会用Object
替换您的类型参数。因此,在编译之后,您的原始班级D
已经
public Object id(Object x)
和
public Integer id(Integer x)
这很好。
但是,在第二个示例中,同一类中有两个版本的public Object id(Object x)
。
答案 1 :(得分:0)
使用@Override注释检查方法是否真的覆盖了另一种方法。
在第一种情况下,您将有2个方法,一个期望String,另一个期望Integer。
在第二种情况下,您创建了在超类型类型擦除后已经退出的相同方法。