关于Java泛型檫除的问题

蜡笔小小小新 发布于 2017/04/03 15:58
阅读 56
收藏 1

看《Java编程思想》泛型章节有讲到关于泛型檫除的问题,说是一个泛型类,在编译时会把泛型T全部檫除为它的边界类型,没有定义边界的话就檫除为Object,所以编译器无法看到泛型具体的类型是什么,因为它把具体类型的类型信息全部檫除了,比如下面代码:

public class ArrayMaker<T> {
	
	private Class<T> kind;
	
	public ArrayMaker(Class<T> kind) {
		this.kind = kind;
	}
	
	public T create() {
		System.out.println(kind);
		try {
			return kind.newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	
	public static void main(String[] args) {
		
		ArrayMaker<String> arrayMaker = new ArrayMaker<String>(String.class);
		String testStrings = arrayMaker.create();
		System.out.println(testStrings.getClass());
	}

}

我的理解是既然檫除了具体类型的类型信息,那在create方法里面打印kind应该看不到String类型啊,可是能得到java.lang.String,是我理解错了吗?

加载中
0
苍牙
苍牙
编译时擦除,但是会有额外信息保留,运行时会还原额外信息,可以看一下编译后的字节码
-1
蓝水晶飞机
蓝水晶飞机
Object类型参数可以接受任意类型的变量实例赋值,但不会改变变量实例的原来的类型!
银杏果果
银杏果果
回复 @蜡笔小小小新 : 他并非答非所问,他的回答是正确的,是你自己都不明白自己写的什么代码,既然问问题,就虚心点,被人既然这么说,你就得认真审查自己的代码。
蓝水晶飞机
蓝水晶飞机
你的构造函数传递的是Class<String>,就是String的Class,Class<String>.newInstance()得到的类型就是java.lang.String
蜡笔小小小新
蜡笔小小小新
答非所问
返回顶部
顶部