java泛型:泛型代码和虚拟机

虚拟机没有泛型类型对象 — 所有对象都属于普通类 。 在泛型实现的早期版本中 ,甚至能够将使用泛型的程序编译为在 1.0 虚拟机上运行的类文件 ! 这个向后兼容性在 Java 泛型开发的后期被放弃了。

 1 类型擦除

无论何时定义一个泛型类型 , 都自动提供了一个相应的原始类型 ( raw type ) 。 原始类型的名字就是删去类型参数后的泛型类型名。 擦除 ( erased )类型变 M , 并替换为限定类型 ( 无限定的变量用 Object )。

例如 , Pair < T > 的原始类型如下所示 :
public class Pair
{
private Object first ;
private Object second ;
public Pair ( Object first , Object second )
{
this , first = first ;
this . second = second ;
public Object getFirstO { return first ; }
public Object getSecondO { return second ; }
public void set First ( Object newValue ) { first = newValue ; }
public void setSecond ( Object newValue ) { second = newValue ; }
}

因为 T 是一个无限定的变量 , 所以直接用 Object 替换 。结果是一个普通的类 , 就好像泛型引人 Java 语言之前已经实现的那样 。在程序中可以包含不 N 类型的 Pair , 例 如 , Pair < String > 或 Pair < LocalDate >。 而擦除类型后就变成原始的 Pair类型了。

原始类型用第一个限定的类型变量来替换 , 如果没有给定限定就用 Object 替换。

 2 翻译泛型表达式

当程序调用泛型方法时, 如果擦除返回类型 ,编译器插入强制类型转换。

 3 翻译泛型方法

类型擦除也会出现在泛型方法中。 程序员通常认为下述的泛型方法
public static < T extends Comparable 〉 T min ( T [ ] a )
是一个完整的方法族, 而擦除类型之后 , 只剩下一个方法 :

public static Comparable min ( Comparable [ ] a )  注意 , 类型参数 T 已经被擦除了,只留下了限定类型 Comparable。方法的擦除带来了两个复杂问题。 


总之, 需要记住有关Java 泛型转换的事实 :
• 虚拟机中没有泛型 , 只有普通的类和方法 。
• 所有的类型参数都用它们的限定类型替换 。
• 桥方法被合成来保持多态 。
• 为保持类型安全性 , 必要时插人强制类型转换 。


扫描二维码关注公众号,回复: 2210803 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_15140841/article/details/80154649
今日推荐