Java基础之如何理解泛型的编译期检查

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、编译期检查

public class Test {  

    public static void main(String[] args) {  
        ArrayList<String> list1 = new ArrayList();  
        list1.add("1"); //编译通过  
        list1.add(1); //编译错误  
        String str1 = list1.get(0); //返回类型就是String  

        ArrayList list2 = new ArrayList<String>();  
        list2.add("1"); //编译通过  
        list2.add(1); //编译通过  
        Object object = list2.get(0); //返回类型就是Object  

        new ArrayList<String>().add("11"); //编译通过  
        new ArrayList<String>().add(22); //编译错误  

        String str2 = new ArrayList<String>().get(0); //返回类型就是String  
    }  
} 

二、泛型的桥接

现在有这样一个泛型类:

class Pair<T> {  

    private T value;  

    public T getValue() {  
        return value;  
    }  

    public void setValue(T value) {  
        this.value = value;  
    }  
}

然后我们想要一个子类继承它。

class DateInter extends Pair<Date> {  

    @Override  
    public void setValue(Date value) {  
        super.setValue(value);  
    }  

    @Override  
    public Date getValue() {  
        return super.getValue();  
    }  
}

先来分析setValue方法,父类的类型是Object,而子类的类型是Date,参数类型不一样,这如果实在普通的继承关系中,根本就不会是重写,而是重载。 我们在一个main方法测试一下:

public static void main(String[] args) throws ClassNotFoundException {  
        DateInter dateInter = new DateInter();  
        dateInter.setValue(new Date());                  
        dateInter.setValue(new Object()); //编译错误  
}

如果是重载,那么子类中两个setValue方法,一个是参数Object类型,一个是Date类型,可是我们发现,根本就没有这样的一个子类继承自父类的Object类型参数的方法。所以说,却是是重写了,而不是重载了。

原因是这样的,我们传入父类的泛型类型是Date,Pair,我们的本意是将泛型类变为如下:

class Pair {  
    private Date value;  
    public Date getValue() {  
        return value;  
    }  
    public void setValue(Date value) {  
        this.value = value;  
    }  
}

可是由于种种原因,虚拟机并不能将泛型类型变为Date,只能将类型擦除掉,变为原始类型Object。这样,我们的本意是进行重写,实现多态。可是类型擦除后,只能变为了重载。这样,类型擦除就和多态有了冲突。

  • 愿你健康平安,快乐常伴。
  • 空庭得秋漫漫,寒露入暮愁衣单
  • 每一个懂事淡定的现在,都有一个很傻很天真的过去,每一个温暖而淡然的如今,都有一个悲伤而不安的曾经。
  • 不要活在别人的嘴里,也不要活在别人的眼里,而是把命运握在自己手里。
  • 要么你去驾驭生命,要么是生命驾驭你,你的心态决定谁是坐骑,谁是骑师。心态的不同必然导致人格和作为的不同,因而也会谱写不同的人生。
  • 朋友,别因为天气的风雨无常而挡住你前进的道路,那只不过是对你的一个考验,只要你能正视这些考验,那么你也就能成功的实现你的梦想。
  • 然万物好像逝去了,但是,你瞧!那火红的枫叶在树枝上摇摆着,就像是一大群顽皮的孩子在手拉手一起跳着欢快的舞蹈呢。有些枫叶因跳舞不慎,从树枝上跌了下来,瞬间化作了一只只飞舞的蝴蝶,在空中飞来飞去。
  • 愿你半生归来,仍旧初心未改,走自己最想要的人生,过出幸福的滋味。
  • 纵然我有千万般好,你也不会看到,因为你没有一双爱我的眼睛。
  • 如果把成才比作登天,自学便是成才的天梯。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和烨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值