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

简介: 泛型类 `Pair<T>` 在类型擦除后,泛型参数变为 `Object`,导致子类 `DateInter` 重写 `setValue(Date)` 和 `getValue()` 时实际为桥接方法实现。尽管看似重写,实则编译器生成桥接方法以兼容多态,虚拟机通过方法签名(参数与返回类型)区分,实现泛型多态的“伪重写”。

假设有一个泛型类
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代码,这样的代码是无法通过编译器的检查的,但是虚拟机却是允许这样做的,因为虚拟机通过参数类型和返回类型来确定一个方法,所以编译器为了实现泛型的多态允许自己做这个看起来“不合法”的事情,然后交给虚拟器去区别

相关文章
|
存储 运维 Oracle
Oracle系列十八:Oracle RAC
Oracle系列十八:Oracle RAC
3324 0
|
3月前
|
存储 人工智能 数据处理
RAG 落地三部曲:用 Milvus + Qwen3.6 打造企业知识库,我踩过的 5 个坑与解法
本文揭秘RAG落地常见误区:文档粗暴切片、纯向量检索、忽略重排序导致知识库“很蠢”。基于阿里云Milvus+百炼Qwen3.6,详解轻量部署、结构化分片、混合检索(向量+全文)、GTE-Rerank重排序及防幻觉Prompt工程,并给出Embedding成本优化策略。(239字)
|
4月前
|
人工智能 监控 测试技术
RAG系统到底该怎么测试效果?AI知识库上线之后,真正难的是评估
本文深入剖析RAG系统落地的核心瓶颈——不是“如何接入”,而是“如何科学评估”。指出RAG作为组合式生成系统,需分检索、证据、答案、工程四层指标协同评估;强调测试必须回归工程化,覆盖离线回归与线上监控,实现问题可归因、优化可度量。持续评估能力正成为AI应用竞争新分水岭。
|
9月前
|
安全 Java 编译器
告别样板代码:探索Java Record的简洁力量
告别样板代码:探索Java Record的简洁力量
543 114
|
存储 持续交付 虚拟化
|
Ubuntu 网络协议
Ubuntu20.04配置静态ip
配置Ubuntu 20.04使用静态IP地址是一个简单直接的过程,特别是借助于Netplan工具。遵循上述步骤,您可以轻松完成静态IP配置,为您的设备提供一个稳定和不变的网络地址。
1596 0
|
Java Spring
Springboot+jpa如何设置启动项目表不存在就主动创建,字段没有就新增
Springboot+jpa如何设置启动项目表不存在就主动创建,字段没有就新增
1478 0
|
机器学习/深度学习 存储 人工智能
这7个矢量数据库你应该知道!
这7个矢量数据库你应该知道!
6160 10
|
JavaScript
vue3,使用watch监听props中的数据
【10月更文挑战第3天】
4303 2