这一章节我们来讨论一下类型擦除的问题与解决。
1.类型擦除的问题
就是对于泛型类型的new、转型、instanceof操作带来错误或者警告
代码:
package com.ray.ch11;
public class Test<T> {
public void test(Object object){
// System.out.println(object instanceof T);//error
// System.out.println(new T());//error
// System.out.println(new T[10]);//error
System.out.println((T)object );//waring
}
}
我们看到上面的代码,对于new和instanceof操作,编译器直接提示是错误,因为编译器在编译期间找不到T的实际对应类型;
在转型操作里面,编译器会给出uncheck的警告,表示编译器不能够检测类型。
2.类型擦除的解决
解决方法:引入类型信息
代码:
package com.ray.ch11;
import java.lang.reflect.Array;
public class Test<T> {
private Class<T> kind;
public Test(Class<T> t) {
kind = t;
}
public void test(Object object) {
System.out.println(kind.isInstance(object));
try {
System.out.println(kind.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println(Array.newInstance(kind, 10));
System.out.println((T) object);// waring
}
}
从上面的代码我们看出,在一开始的时候我们就引入了T的类型信息,通过类型信息的标签,编译器可以确保类型信息匹配泛型参数,因此编译通过。
总结:这一章节简单介绍了类型擦除的问题与解决。
这一章节就到这里,谢谢。
-----------------------------------