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在运行时存活的类型参数呢?
由于我第一次接触泛型是使用 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类型。
| 归档时间: |
|
| 查看次数: |
340 次 |
| 最近记录: |