泛型擦除与多态的冲突与解决方法

简介: 泛型擦除与多态的冲突与解决方法

假设有一个泛型类
class Pair {

private T value;  

public T getValue() {  
    return value;  
}  

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

}
然后有一个子类需要继承
class DateInter extends Pair {

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

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

}
在这个子类中,我们设定父类的泛型类型为Pair,在子类中,我们覆盖了父类的两个方法,我们的原意是这样的:将父类的泛型类型限定为Date,那么父类里面的两个方法的参数都为Date类型。
所以,我们在子类中重写这两个方法一点问题也没有,实际上,从他们的@Override标签中也可以看到,一点问题也没有,实际上是这样的吗?
分析:实际上,类型擦除后,父类的的泛型类型全部变为了原始类型Object,所以父类编译之后会变成下面的样子:
class Pair {
private Object value;

public Object getValue() {  
    return value;  
}  

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

}
而此时,子类中类型依然是Date,这如果还是在继承关系中,那么根本就不是重写,而是重载了。通过反编译会发现子类中的方法Object getValue()和Date getValue()是同 时存在的,可是如果是常规的两个方法,他们的方法签名是一样的,也就是说虚拟机根本不能分别这两个方法。如果是我们自己编写Java代码,这样的代码是无法通过编译器的检查的,但是虚拟机却是允许这样做的,因为虚拟机通过参数类型和返回类型来确定一个方法,所以编译器为了实现泛型的多态允许自己做这个看起来“不合法”的事情,然后交给虚拟器去区别。

相关文章
|
消息中间件 算法 Java
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
1383 1
弥补延时消息的不足,RocketMQ 基于时间轮算法实现了定时消息!
|
安全 NoSQL MongoDB
XJ-Survey:这个让滴滴日均处理1.2亿次问卷请求的开源系统,今天终于公开了它的架构密码!
嗨,大家好,我是小华同学。今天为大家介绍一款由滴滴开源的高效调研系统——XJ-Survey。它功能强大,支持多类型数据采集、智能逻辑编排、精细权限管理和数据在线分析,适用于问卷、考试、测评等场景。采用 Vue3、NestJS 等先进技术栈,确保高性能与安全性。无论是企业还是个人,XJ-Survey 都是你不可错过的神器!项目地址:[https://github.com/didi/xiaoju-survey](https://github.com/didi/xiaoju-survey)
607 15
|
机器学习/深度学习 数据采集 搜索推荐
大数据与金融风控:信用评估的新标准
【10月更文挑战第31天】在数字经济时代,大数据成为金融风控的重要资源,特别是在信用评估领域。本文探讨了大数据在金融风控中的应用,包括多维度数据收集、智能数据分析、动态信用评估和个性化风控策略,以及其优势与挑战,并展望了未来的发展趋势。
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
编解码 人工智能 自然语言处理
MaskGCT:登上GitHub趋势榜榜首的TTS开源大模型
近日,香港中文大学(深圳)联手趣丸科技推出了新一代大规模声音克隆TTS模型——MaskGCT。一起看看该模型的一些表现吧!
|
Web App开发 JavaScript 前端开发
|
分布式计算 Hadoop 程序员
ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
|
前端开发
奇思妙想 CSS 文字动画 (下)
奇思妙想 CSS 文字动画 (下)
709 0
奇思妙想 CSS 文字动画 (下)
|
算法 Linux Shell
我能在不同空间下操作寄存器,快学起来!
我能在不同空间下操作寄存器,快学起来!
|
存储 XML 缓存
详解Hadoop3.x新特性功能-HDFS纠删码
详解Hadoop3.x新特性功能-HDFS纠删码
1124 0
详解Hadoop3.x新特性功能-HDFS纠删码

热门文章

最新文章