小企业网站建设论文,商业网站开发岗位需求分析,恐怖小说网站怎么做,wordpress主题删除失败文章目录 泛型擦除(1)转换泛型表达式(2)转换泛型方法泛型擦除带来的问题 泛型擦除 在编码阶段使用泛型时加上的类型参数#xff0c;会被编译器在编译阶段去掉#xff0c;这个过程叫做泛型擦除。 泛型主要用于编译阶段。在编译后生成的Java字节码文件中不包含泛型中的类型信息… 文章目录 泛型擦除(1)转换泛型表达式(2)转换泛型方法泛型擦除带来的问题 泛型擦除 在编码阶段使用泛型时加上的类型参数会被编译器在编译阶段去掉这个过程叫做泛型擦除。 泛型主要用于编译阶段。在编译后生成的Java字节码文件中不包含泛型中的类型信息。例如在编码时定义的ListInteger和ListString经过编译后统一为List。JVM读取的只是List由泛型附加的类型信息对JVM来说是不可见的。 Java核心技术卷I解释 无论何时定义一个泛型类型都会自动提供一个相应的原始类型(raw type)。这个原始类型的名字就是去掉类型参数后的泛型类型名。类型变量会被擦除(erased)并替换为其限定类型(或者对于无限定的变量则替换为Object)。
例如
泛型类PairT如下
public class PairT{private T first;private T second;public Pair(T first,T second){this.firstfirst;this.secondsecond;}public T getFirst(){return first;}public T getSecond(){return second;}public void setFirst(T newValue){firstnewValue;}public void setSecond(T newValue){secondnewValue;}
}PairT的原始类型如下所示
public class Pair{private Object first;private Object second;public Pair(Object first,Object second){this.firstfirst;this.secondsecond;}public Object getFirst(){return first;}public Object getSecond(){return second;}public void setFirst(Object newValue){firstnewValue;}public void setSecond(Object newValue){secondnewValue;}
}因为T是一个无限定的变量所以直接用Object替换。 在程序中可以包含不同类型的Pair,例如PairString或PairLocalDate。不过擦除类型后它们都会编程原始的Pair类型。 假定我们声明了泛型上限
public class IntervalT extends ComparableSerializable implements Serializable{private T lower;private T upper;...public Interval(T first,T second){if(first.compareTo(second)0){lowerfirst;uppersecond;}else{lowersecond;upperfirst;}}
}此时原始类型如下所示
public class Interval implements Serializable{private Comparable lower;private Comparable upper;...public Interval(Comparable first,Comparable second){if(first.compareTo(second)0){lowerfirst;uppersecond;}else{lowersecond;upperfirst;}}
}如果将限定切换为class IntervalT extends SerializableComparable原始类型会用Serializable替换T而编译器在必要时要向Comparable插入强制类型转换。 (1)转换泛型表达式 编写一个泛型方法调用时如果擦出了返回类型编译器会插入强制类型转换。例如
PairEmployee buddies...;
Employee buddybuddies.getFirst();getFirst擦除类型后的返回类型是Object。编译器自动插入转换到Employee的强制类型转换。也就是说编译器把这个方法调用转换为两条虚拟机指令
对原始方法Pair.getFirst的调用。将返回的Object类型强制转换为Employee类型。 当访问一个泛型字段时也要插入强制类型转换。假设Pair类的first字段和second字段都是公共的。表达式
Employee buddybuddies.first;也会在结果字节码中插入强制类型转换。
(2)转换泛型方法 类型擦除也会出现在泛型方法中。
public static T extends Comparable T min(T[] a)经过泛型擦除后只剩下
public static Comparable min(Comparable[] a);注意类型参数T已经被擦出了只留下了限定类型Comparable。 泛型擦除带来的问题 当然泛型擦除也带来了许多问题这里就不细讲了只是小总结下
不能用基本类型实例化类型参数运行时类型查询只适用于原始类型不能创建参数化类型的数组不能实例化类型变量不能构造泛型数组泛型类的静态上下文中类型变量无效不能抛出或捕获泛型类的实例可以取消对检查型异常的检查注意擦除后的冲突 参考 《剑指Java》 《Java核心技术卷I》 泛型详解 泛型之类型擦除