2016-08-28 2 views
1
class Generic<T> { 
    void method(T t) { 
     print(t.getClass().getSimpleName()); 
    } 
} 
public class Program { 
    static public void main(String[] args) { 
     Generic<String> g = new Generic1<>(); 
     g.method(new String()); 
    } 
} 

Как и ожидалось, выход String. Почему информация о типе была сохранена, если произошло стирание типа? Если я правильно ее понимаю, выход должен был быть Object.Почему информация сохранялась после стирания типа?

+0

При запуске 't' определен, он имеет тип. Некоторое чтение: https://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens?rq=1 –

+0

Передача (или сохранение) экземпляра класса является классическим способом чтобы обойти стирание стилей. –

ответ

3

Это не имеет ничего общего с дженериками.

Каждый объект knows it class object. Вы получаете «String» как вывод, потому что это просто класс выполнения строкового объекта (который, кстати, вы создаете).

8

По той же причине, что это работает:

  Object s = new String(); 
// Note ----^^^^^^ 
      System.out.println(s.getClass().getSimpleName()); 

объекта все еще знает, что это такое, и может сказать нам, когда мы спрашиваем его через getClass.

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