Java泛型 - 擦除概念

时间:2015-12-08 17:31:28

标签: 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){
            System.out.println("here is T");
        }
    }

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

}

根据我的理解,在类型擦除之后,课程T将成为:

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

和m重载。

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

here is T
here is X

然而,结果是

here is T
here is T

我想知道为什么结果会如此。

2 个答案:

答案 0 :(得分:7)

你几乎回答了自己的问题。你只需要完全遵循后果。为你的代码所有擦除你得到的:

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

答案 1 :(得分:2)

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

   t.<Object>m(new Object());
   t.<String>m(new String());

调用超类泛型方法。

现在检查一下 -

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

}