2015-04-21 6 views
0

Этот код, составленный с помощью Java SE-1.7, дает следующий результат (см. Ниже). Я понимаю, что предполагаемый тип значения должен быть Object, как получается, что существуют типы String и Integer?Generics - тип вывода и тип erasure

public class Generics1 { 

    public class Pocket<T>{ 
     public T value; 
     public void set(T value) { this.value = value; } 
     public void set(String value) { this.value = (T)value; } //warning 
    } 

    public static void main(String[] args) { 

     Pocket<Object> intPocket = new Generics1().new Pocket<>(); 

     intPocket.set("foo"); 
     System.out.println(intPocket.value); 
     System.out.println(intPocket.value.getClass().getName()); 

     intPocket.set(12); 
     System.out.println(intPocket.value); 
     System.out.println(intPocket.value.getClass().getName()); 
    } 
} 

Выход:

foo 
java.lang.String 
12 
java.lang.Integer 

ответ

2

value.getClass() возвращает тип выполнения объекта, который ссылается на value.

Integer хранящийся в поле типа Object по-прежнему Integer.

+0

Следует отметить, что '12' может быть' Integer' буквальным. – Turing85

+0

@ Turing85: Литерал совсем не имеет отношения. – SLaks

1

Переменная public T value имеет свой тип стирания, поэтому это по существу . Но даже если ваша переменная не указала точный тип, сам экземпляр все еще знает, что это за класс.

E.g.

Object value = "bananas"; 
System.out.println(value.getClass().getName()); 

Выход:

 
java.lang.String