今天我偶然发现了一些有趣的东西。 假设以下Java 6类:
public class Ereasure {
public Object get(Object o) {
return null; // dummy
}
public static class Derived<T> extends Ereasure{
// (1)
@Override
public Object get(T o) {
return super.get(o);
}
// (2)
/*
@Override
public Object get(Object o) {
return super.get(o);
}*/
}
}
如果您尝试编译上面的示例,编译器会报错: Ereasure.java:9: method does not override or implement a method from a supertype @Override 如果您删除 @Override 注释(其实不需要!),它会说: Ereasure.java:8: name clash: get(T) in Ereasure.Derived and get(java.lang.Object) in Ereasure have the same erasure, yet neither overrides the other 这有点矛盾,因为 T 应该擦除为 Object 并覆盖父类的 get 方法。
如果您保留 (1) 不加注释并取消对 (2) 的注释,以便 (1) 重载 (2),那么也不会起作用。 编译器输出:
Ereasure.java:15: get(T) is already defined in Ereasure.Derived
public Object get(Object o) {
作为结论,T正在被擦除为Object,但无法覆盖父类的get方法。
我的问题是,为什么至少有一个示例不能编译?