Java泛型04 : 泛型类型擦除( 二 )


编写示例如下:
/*** Title: 有界泛型类型 类型擦除之后的原始类型 示例
* @author 韩超 2018/2/23 10:36*/static class DemoList{private T t;public T setT(T t){this.t = t;return t;}}public static void main(String[] args) {//有界泛型类型擦除之后的原始类型System.out.println();LOGGER.info("有界泛型类型擦除之后的原始类型:");DemoList demoList = new DemoList();LOGGER.info(demoList.getClass().getDeclaredField("t").getType());Method[] methods = demoList.getClass().getDeclaredMethods();for (Method method : methods) {LOGGER.info(method.getReturnType() + " " + method.getName() + " (" + method.getParameterTypes()[0] + ")");}LOGGER.info("有界泛型类型擦除之后的原始类型:父类型");}

运行结果:
2018-02-23 10:41:51 INFOTypeErasureDemo:70 - 有界泛型类型擦除之后的原始类型:2018-02-23 10:41:51 INFOTypeErasureDemo:72 - class java.lang.Number2018-02-23 10:41:51 INFOTypeErasureDemo:75 - class java.lang.Number setT (class java.lang.Number)2018-02-23 10:41:51 INFOTypeErasureDemo:77 - 有界泛型类型擦除之后的原始类型:父类型
结论:有界泛型类型擦除之后的原始类型:父类型
那么多重有界的泛型类型呢?
编写示例如下:
/*** Title: 多重 有界泛型类型 类型擦除之后的原始类型 示例
* @author 韩超 2018/2/23 10:43*/static class AList{private T t;public T setT(T t){this.t = t;return t;}}static class BList{private T t;public T setT(T t){this.t = t;return t;}}public static void main(String[] args){//多重有界泛型类型擦除之后的原始类型System.out.println();LOGGER.info("多重有界泛型类型擦除之后的原始类型:");AList aList = new AList();LOGGER.info(aList.getClass().getDeclaredField("t").getType());Method[] methods = aList.getClass().getDeclaredMethods();for (Method method : methods) {LOGGER.info(method.getReturnType() + " " + method.getName() + " (" + method.getParameterTypes()[0] + ")");}BList bList = new BList();LOGGER.info(bList.getClass().getDeclaredField("t").getType());Method[] methods2 = bList.getClass().getDeclaredMethods();for (Method method : methods2) {LOGGER.info(method.getReturnType() + " " + method.getName() + " (" + method.getParameterTypes()[0] + ")");}LOGGER.info("多重有界泛型类型擦除之后的原始类型:第一个父类型");}

运行结果:
2018-02-23 10:47:38 INFOTypeErasureDemo:100 - 多重有界泛型类型擦除之后的原始类型:2018-02-23 10:47:38 INFOTypeErasureDemo:102 - interface java.io.Serializable2018-02-23 10:47:38 INFOTypeErasureDemo:105 - interface java.io.Serializable setT (interface java.io.Serializable)2018-02-23 10:47:38 INFOTypeErasureDemo:108 - interface java.lang.Comparable2018-02-23 10:47:38 INFOTypeErasureDemo:111 - interface java.lang.Comparable setT (interface java.lang.Comparable)2018-02-23 10:47:38 INFOTypeErasureDemo:113 - 多重有界泛型类型擦除之后的原始类型:第一个父类型
结论:多重有界泛型类型擦除之后的原始类型:第一个父类型
3.先检查后编译
既然泛型会在编译阶段进行类型擦除 , 那如何保证编译之前的类型转换安全呢?答案是:通过IDE提供的编译前检查功能

Java泛型04 : 泛型类型擦除

文章插图
再看下面一段代码:
//类型擦除与编译前检查LOGGER.info("类型擦除与编译前检查:");MyGenericsType integerMyGenericsType1 = new MyGenericsType();//类型检查通过integerMyGenericsType1.setT(new Integer(1));//类型检查不通过 , 在IDE中报错integerMyGenericsType1.setT(new Double(2D));