这一章节我们来讨论一下类型擦除的问题与解决。
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的类型信息,通过类型信息的标签,编译器可以确保类型信息匹配泛型参数,因此编译通过。
总结:这一章节简单介绍了类型擦除的问题与解决。
这一章节就到这里,谢谢。
-----------------------------------
原文:http://blog.csdn.net/raylee2007/article/details/50307559