Java泛型-擦除概念

Java泛型-擦除概念,java,generics,types,erasure,Java,Generics,Types,Erasure,我有一些代码如下: public class java_generic { public static void main(String[] args) { T t = new X(); t.<Object>m(new Object()); t.<String>m(new String()); } static class T { <E> void m (E e){

我有一些代码如下:

public class java_generic {

    public static void main(String[] args) {

        T t = new X();
        t.<Object>m(new Object());
        t.<String>m(new String());

    }

    static class T {
        <E> void m (E e){
            System.out.println("here is T");
        }
    }

    static class X extends T {
        void m (String o){
            System.out.println("here is X");            
        }
    }

}
m是重载的

由于有
m(Object)
m(String)
,我希望结果是

here is T
here is X
然而,结果是

here is T
here is T

我想知道为什么结果会是这样。

你几乎回答了你自己的问题。你只需要完全遵循后果。对所有代码执行擦除,您将得到以下结果:

public class java_generic {

    public static void main(String[] args) {
        T t = new X();
        t.m(new Object());
        t.m(new String());
    }

    static class T {
        void m (Object e){
            System.out.println("here is T");
        }
    }

    static class X extends T {
        void m (String o){
            System.out.println("here is X");            
        }
    }
}

这很有希望说明
X.m
不会覆盖
T.m
,因此通过
T
引用的调用永远不能调用
X.m

,因为TX的超类,X的实例被分配给超类对象T,您无法真正访问子类X方法。因此两者

   t.<Object>m(new Object());
   t.<String>m(new String());
t.m(新对象());
t、 m(新字符串());
调用超类泛型方法

现在检查这边-

public class java_generic {

    public static void main(String[] args) {
        X x = new X();
        x.<Object>m(new Object());
        x.<String>m(new String());

    }

    static class T {
        <E> void m (E e){
            System.out.println("here is T");
        }
    }

    static class X extends T {
        void m (String o){
            System.out.println("here is X");            
        }
    }

}
公共类java\u泛型{
公共静态void main(字符串[]args){
X=新的X();
x、 m(新对象());
x、 m(新字符串());
}
静态T类{
无效m(E){
System.out.println(“这里是T”);
}
}
静态类X扩展了T{
空m(字符串o){
System.out.println(“这里是X”);
}
}
}

请不要说出您实际的班级名称
t
。单字母名称通常是为通用类型名称保留的,如
。此外,您不应该在生产中使用此类代码
public class java_generic {

    public static void main(String[] args) {
        X x = new X();
        x.<Object>m(new Object());
        x.<String>m(new String());

    }

    static class T {
        <E> void m (E e){
            System.out.println("here is T");
        }
    }

    static class X extends T {
        void m (String o){
            System.out.println("here is X");            
        }
    }

}