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 泛型转换的事实 :
• 虚拟机中没有泛型 , 只有普通的类和方法 。
• 所有的类型参数都用它们的限定类型替换 。
• 桥方法被合成来保持多态 。
• 为保持类型安全性 , 必要时插人强制类型转换 。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值