Java中数组之间的类型转换

本文探讨Java中数组类型的转换,解释为何Object[]类型的引用可以指向String[]类型的对象,这源于String[]是Object[]的subtype。内容涉及Widening Reference Conversion,以及如何确定数组类型间的subtype关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引出问题

有时我们会看见这样的代码

String[] strs = new String[10];
Object[] objs = strs;

一个Object类型的数组指向了一个String类型的数组,我们很容易猜测到这其中一定发生了类型转换。

直觉地,我们猜测是否String[]类型和Object[]类型之间有继承关系,也即是说 if String[] is a subclass of Object[]。
我们使用反射验证一下

public static void main(String[] args) {
	String[] strs = new String[10]; 
	System.out.println(strs.getClass().getSuperclass().getName());
}

结果是java.lang.Object,String[]的直接父类是Object,显然String[]和Object[]之间不存在继承关系。那么为什么Object[]类型的引用可以指向String[]类型的对象?
答案是 String[] is a subtype of Object[]。

二、解开面纱

实际上String[]到Object[]的转换属于Widening Reference Conversion
详情参看 java se sepcification
在这里插入图片描述
也就是说如果S is a subtype of T,S到T就存在这种转换。因为String[] is a subtype of Object[],所以当将String[]类型的变量赋给Object[]时,就发生了这种转换。

实际上,String类型的变量赋值给Object类型也属于这种类型转换。因为在Java中具有subclass关系必定具有subtype关系。详情参看 Barbara Liskov的讲义

直白地讲,不仅仅是具有继承关系subclass的子类父类之间存在子类向父类的自动转换,具有subtype关系的数据类型也是可以的。

相信小伙伴们一定发现关键点在于subclasssubtype问题上,实际上 Barbara Liskov的讲义就在阐述这两个内容。

长篇大论太难为我们了,这里借用StackOverflow里面的一个回答做一个简单的辨析,可能不太准确。
在这里插入图片描述总之,我们需要知道的就是,subclass就是我们通常说的继承关系,而subtype更为宽泛,Java中具有subclass关系必定具有subtype关系。

三、如何确定数组类型之间具有subtype关系?

好了,说了这么多我们知道了,数组类型之间如果具有subtype关系就可以相互转化,那么如何知道数组类型之间具有subtype关系。
详情参看 java se sepcification
在这里插入图片描述
解释一下:iff 的意思是 if and only if, S >1 T的意思是S is the direct supertype of T。

直白地讲,数组类型之间的subtype关系可以由数组存储的元素类型确定,例如因为Object is a supertype of String, 所以Object[] is a supertype of String[]。

觉得有帮助请点个赞,发现错误也欢迎指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值