3、泛型-泛型代码和虚拟机

泛型代码和虚拟机

虚拟机没有泛型类型,只有普通的类和方法。无论何时定义一个泛型类型,都自动提供一个相应的原始类型。原始类型的名字就是删除类型参数后的泛型类型名。擦除类型变量,并替换为限定类型,无限定类型的变量用Object。

Pair<T>的原始类型,因为T是一个无限定的变量,所有直接用Object替换。

public class Pair {
    private  Object first;
    private  Object second;

    public Pair() {
        first=null;
        second=null;
    }

    public Pair(Object firsObject, Object second) {
        this.first = firsObject;
        this.second = second;
    }

    public Object geObjectFirsObject() {
        return first;
    }

    public void seObjectFirsObject(Object firsObject) {
        this.first = firsObject;
    }

    public Object geObjectSecond() {
        return second;
    }

    public void seObjectSecond(Object second) {
        this.second = second;
    }
}

如果有限定类型,就用第一个限定的类型变量来替换。比如Pair<T extends Comparable & Serializable >

public class Pair {
    private Comparable first;
    private Comparable second;

    public Pair() {
        first=null;
        second=null;
    }

    public Pair(Comparable first, Comparable second) {
        this.first = first;
        this.second = second;
    }
}    

如果切换限定列表,Pair<T extends Serializable & Comparable>,原始类型就用Serializable替换T,为了提高效率,应该讲标签接口(即没有方法的接口)放在类别的末尾。

翻译泛型表达式

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

Pair<Employee> buddies = new Pair();
Employee buddy = buddies.getFirst();

擦除getFirst的返回类型后将返回Object类型,编译器自动插入Employee的强制类型转换,也就是说,编译器把这个方法调用翻译为两条虚拟机指令:

  • 对原始方法Pair.getFirst的调用。
  • 将返回的Object类强制转换为Employee类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值