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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 泛型类 `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代码,这样的代码是无法通过编译器的检查的,但是虚拟机却是允许这样做的,因为虚拟机通过参数类型和返回类型来确定一个方法,所以编译器为了实现泛型的多态允许自己做这个看起来“不合法”的事情,然后交给虚拟器去区别

相关文章
|
2月前
|
机器学习/深度学习 算法 算法框架/工具
基于yolov8的深度学习水果识别检测系统
在农业现代化与消费升级背景下,基于YOLOv8的水果智能检测系统应运而生。该系统利用计算机视觉技术,实现高效、精准的水果识别与分级,广泛应用于生产、流通与零售环节,显著提升分拣效率、降低人工成本,并推动农业智能化发展。
|
2月前
|
数据安全/隐私保护
RBAC权限模型
RBAC(基于角色的访问控制)通过角色管理权限,实现用户与权限的间接关联,提升系统安全性与管理效率。其三大原则:最小权限、职责分离、数据抽象,使权限分配更清晰、灵活,广泛应用于现代权限管理系统中。
|
2月前
|
安全 小程序 JavaScript
OAuth2.0四种授权模式
OAuth2四种授权模式简介:授权码模式最安全,适用于第三方登录;简化模式适用于无后端的应用;密码模式需高度信任;客户端模式用于服务间调用,无需用户参与。
|
2月前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba诞生
阿里基于Spring Cloud打造Alibaba生态,推出Nacos、Sentinel、Seata等核心组件,覆盖服务发现、配置管理、流量控制与分布式事务,形成完整微服务解决方案,获Spring官方认可,推动Spring Cloud在企业级场景高效落地。
|
3月前
|
人工智能 小程序 vr&ar
AR体感游戏,拓宽AI运动小程序的应用边界
AR体感游戏融合AI与AR技术,通过摄像头捕捉动作,将运动变为趣味互动。无需穿戴设备,手机即可畅玩,适合全年龄段,尤其激发低龄儿童运动兴趣。沉浸式体验让锻炼如游戏般上瘾,广泛应用于赛事、团建、校园及康复场景,借助AI运动识别插件,开发更高效便捷。
|
19天前
|
存储 数据采集 运维
自建埋点分析系统的成本对比(含 ClkLog 开源方案)
本文对比自建埋点系统与基于开源ClkLog方案的成本与落地效率:完全自建需几十万、周期长、风险高;而ClkLog可一周快速部署,首期投入仅几万元,覆盖采集、接入、存储、分析及可视化全链路,兼顾数据自主性与实施可控性。
|
人工智能 语音技术 开发者
千问max#百炼AI实训课作业#科幻小说家
根据教程一步步操作确实有趣,尤其是语音识别的准确度很高,带来了很好的开发体验。通过详细步骤引导,开发者可以轻松上手并实现高质量的语音交互功能。
|
5月前
|
存储 SQL 数据库
OceanBase存储过程基本使用
OceanBase存储过程基本使用
|
7月前
淘宝图搜接口功能解析
淘宝图搜是基于图像识别的便捷购物工具,支持通过图片查找商品,省去手动输入关键词的麻烦。本文详解其功能、常见问题及解决方法,助你高效使用这一工具。
|
10月前
|
安全 架构师 云计算
玄鹿网络 | 中小企业如何借势互联网,打造强势网络品牌?
玄鹿网络在互联网+时代,中小企业面临机遇与挑战,品牌成为企业生存发展的核心灵魂。玄鹿网络通过网络营销助力中小企业塑造品牌形象,其中问答营销可树立良好口碑,B2B网站推广能获取高质量流量,建立企业官网则是展示品牌的窗口。阿里云建站产品如【云·速成美站】和【云·企业官网】,提供快速、稳定、安全的建站服务,助力企业打造独特网络名片,在竞争中脱颖而出。
玄鹿网络 | 中小企业如何借势互联网,打造强势网络品牌?