我有一些代码如下:

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

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

最佳答案

您几乎回答了自己的问题。您只需要完全了解后果即可。对所有进行擦除,您将得到以下信息:

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

关于java - Java泛型-擦除概念,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34162305/

10-08 20:44