泛型 - 类型推断和类型擦除

时间:2015-04-21 15:01:56

标签: java generics types type-inference type-erasure

使用Java SE-1.7编译的此代码提供以下输出(如下所示)。我明白,推断的值类型应该是Object,如何识别String和Integer Types?

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 个答案:

答案 0 :(得分:2)

value.getClass()返回value引用的对象的运行时类型。

存储在Integer类型字段中的Object仍为Integer

答案 1 :(得分:1)

变量public T value的类型已被删除,因此它基本上是public Object value。但即使你的变量没有指定确切的类型,实例本身仍然知道它是什么类。

E.g。

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

输出:

java.lang.String