Generics - вывод типа и стирание типа

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

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

person Picrochole    schedule 21.04.2015    source источник


Ответы (2)


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

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

person SLaks    schedule 21.04.2015
comment
Следует отметить, что 12 может быть литералом Integer. - person Turing85; 21.04.2015
comment
@ Turing85: Буквальное значение вообще не имеет значения. - person SLaks; 21.04.2015

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

E.g.

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

Выход:

java.lang.String
person khelwood    schedule 21.04.2015