前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于泛型的擦除解释

关于泛型的擦除解释

原创
作者头像
用户2422918
修改2020-06-29 10:21:54
6030
修改2020-06-29 10:21:54
举报

类型擦除会出现在泛型方法中,程序员通常认为下述的泛型方法

代码语言:javascript
复制
public static <T extends Comparable> T min(T[] a)

是一个完整的方法族,而擦除类型之后,只剩下一个方法:

代码语言:javascript
复制
public static Comparable min(Comparable[] a)

这个时候类型参数T已经被擦除了,只留下了限定类型Comparable

但是方法的擦除会带来一些问题:

代码语言:javascript
复制
class Coupling extends Couple<People> {
    public void setTwo(People people) {
            super.setTwo(people);
    }
}

擦除后:

代码语言:javascript
复制
class Coupling extends Couple {
    public void setTwo(People People) {...}
}

这时,问题出现了,存在另一个从Couple类继承的setTwo方法,即:

代码语言:javascript
复制
public void setTwo(Object two)

这显然是一个不同的方法,因为它有一个不同类型的参数(Object),而不是People

代码语言:javascript
复制
Coupling coupling = new Coupling(...);
Couple<People> cp = interval;
cp.setTwo(people);

这里,希望对setTwo的调用具有多态性,并调用最合适的那个方法。由于cp引用Coupling对象,所以应该调用Coupling.setTwo。问题在于类型擦除与多态发生了冲突。要解决这个问题,就需要编译器在Coupling类中生成一个桥方法:

代码语言:javascript
复制
public void setTwo(Object second) {
    setTwo((People)second);
}

变量cp已经声明为类型Couple,并且这个类型只有一个简单的方法叫setTwo,即setTwo(Object)。虚拟机用cp引用的对象调用这个方法。这个对象是Coupling类型的,所以会调用Coupling.setTwo(Object)方法。这个方法是合成的桥方法。它会调用Coupling.setTwo(Date),这也正是我们所期望的结果。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档