Java中的泛型类型擦除

Ram*_*lfc 7 java generics type-erasure

这是代码:

public class Main {
    public static void main(String[] args) {
        Gen<Integer> g = new Gen<Integer>(5);

        System.out.println(g.getClass());
        System.out.println(g.ob.getClass());
    }
}

class Gen<T> {
    T ob;

    public Gen(T x) {
        ob = x;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出

class Gen               // This I understand
class java.lang.Integer // But if type erasure is happening, shouldn't this be java.lang.Object?
Run Code Online (Sandbox Code Playgroud)

我知道Type参数T在运行时被擦除了,但是为什么ob在运行时存活的类型参数呢?

Ram*_*lfc 0

由于我第一次接触泛型是使用 C#,所以花了一些时间来掌握 java 中的类型擦除。

但是在更好地理解 java 泛型之后,我意识到在我的问题中我混合了 2 个独立的主题:泛型和反射。

主要问题是,为什么第二个打电话到这里

 System.out.println(g.getClass());
 System.out.println(g.ob.getClass());
Run Code Online (Sandbox Code Playgroud)

返回java.lang.Integer而不是java.lang.Object.

看看 的文档getClass(),答案就很明显了

返回此对象的运行时类。

因此,getClass()不返回引用的类型,而是返回引用所引用的实际对象。

对于前:

Object o =  "abc";
System.out.println(o.getClass());
Run Code Online (Sandbox Code Playgroud)

输出不是引用的类型,java.lang.Object而是对象的 实际java.lang.String类型。