如何解释这些奇怪的删除规则与删除?

时间:2017-11-09 18:16:18

标签: java generics override type-erasure

这里发生了什么以及如何理解它?

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

2 个答案:

答案 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。

在第二种情况下,您创建了在超类型类型擦除后已经退出的相同方法。