编程语言
首页 > 编程语言> > Java泛型 – 擦除概念

Java泛型 – 擦除概念

作者:互联网

我有一些代码如下:

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,types,generics,erasure
来源: https://codeday.me/bug/20190722/1503686.html