Java泛型04 : 泛型类型擦除

超级通道: Java泛型学习系列-绪论
本章主要对Java泛型的类型擦除进行学习 。
经过前面几个章节的学习 , 可以掌握泛型的基本用法 , 但是有可能这种掌握只是死记硬背 。
为了从根本上掌握泛型的使用 , 我们需要正确的理解泛型 , 为了正确的理解泛型 , 我们需要首先理解类型擦除(Type )的概念 。
1.类型擦除初识
先看Java泛型02 : 泛型原始类型、泛型类型命名规范、有界类型的一个例子 。
/*** Title: 泛型原始类型使用
* @author 韩超 2018/2/22 11:21*/public static void main(String[] args){//泛型原始类型MyGenericsType myGenericsType = new MyGenericsType();LOGGER.info(myGenericsType.getClass().toString());//泛型类型MyGenericsType integerMyGenericsType = new MyGenericsType();LOGGER.info(integerMyGenericsType.getClass().toString());}

我们对这个例子进行修改 , 如下:
//类型擦除LOGGER.info("类型擦除:");MyGenericsType myGenericsType = new MyGenericsType();MyGenericsType integerMyGenericsType = new MyGenericsType();MyGenericsType doubleMyGenericsType = new MyGenericsType();LOGGER.info(myGenericsType.getClass().toString());LOGGER.info(integerMyGenericsType.getClass().toString());LOGGER.info(doubleMyGenericsType.getClass().toString());
运行结果:
2018-02-23 09:41:53 INFOTypeErasureDemo:22 - 类型擦除:2018-02-23 09:41:53 INFOTypeErasureDemo:26 - class pers.hanchao.generics.type.MyGenericsType2018-02-23 09:41:53 INFOTypeErasureDemo:27 - class pers.hanchao.generics.type.MyGenericsType2018-02-23 09:41:53 INFOTypeErasureDemo:28 - class pers.hanchao.generics.type.MyGenericsType
通过观察运行结果 , 可以发现 , 泛型在编译之后 , 只保留了原始类型 , 即 。
泛型类型擦除:泛型在编译阶段 , 生成的字节码中不包含泛型类型 , 只保留原始类型 。
2.类型擦除的原始类型
上面说到 , 类型擦除之后 , 只保留原始类型 , 那么原始类型到底是什么类型呢?
看下面一段代码:
/*** Title: 类型擦除之后的原始类型 示例
* @author 韩超 2018/2/23 10:32*/static class TempList{private T t;public T setT(T t) {this.t = t;return t;}}public static void main(String[] args) {//类型擦除之后的原始类型System.out.println();LOGGER.info("泛型类型擦除之后的原始类型:");TempList tempList = new TempList();LOGGER.info(tempList.getClass().getDeclaredField("t").getType());Method[] methods = tempList.getClass().getDeclaredMethods();for (Method method : methods) {LOGGER.info(method.getReturnType() + " " + method.getName() + " (" + method.getParameterTypes()[0] + ")");}}

运行结果:

Java泛型04 : 泛型类型擦除

文章插图
2018-02-23 10:32:18 INFOTypeErasureDemo:43 - 类型擦除之后的原始类型:2018-02-23 10:32:18 INFOTypeErasureDemo:45 - class java.lang.Object2018-02-23 10:32:18 INFOTypeErasureDemo:48 - class java.lang.Object setT (class java.lang.Object)
可以肯定:无界的泛型类型擦除之后的原始类型是类型 。
上面的经过编译阶段的类型擦除 , 形成的原始类型如下:
static class TempList{private Object t;public Object setT(Object t) {this.t = t;return t;}}
那么有界的泛型类型呢?