2015-12-08 2 views
3

У меня есть некоторый код следующим образом: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(Object) и m(String), я ожидаю, что результат будет

here is T 
here is X 

Однако результат

here is T 
here is T 

Интересно, почему результат будет таким.

+4

Пожалуйста, не имя вашего фактического класса 'T'. Однобуквенные имена обычно зарезервированы для имен типовых типов, таких как '' '' '' '' ''. – Pshemo

+0

Кроме того, вы не должны использовать такой код в производстве – Everv0id

ответ

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.

2

Поскольку T является суперкласс X и экземпляр X назначается суперкласс Object т, вы не можете действительно получить доступ к Подкласс 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");    
     } 
    } 

} 
Смежные вопросы