欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中数组之间的类型转换

程序员文章站 2022-04-07 18:03:09
引出问题有时我们会看见这样的代码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];
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
Java中数组之间的类型转换
也就是说如果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的讲义就在阐述这两个内容。

长篇大论太难为我们了,这里借用*里面的一个回答做一个简单的辨析,可能不太准确。
Java中数组之间的类型转换总之,我们需要知道的就是,subclass就是我们通常说的继承关系,而subtype更为宽泛,Java中具有subclass关系必定具有subtype关系。

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

好了,说了这么多我们知道了,数组类型之间如果具有subtype关系就可以相互转化,那么如何知道数组类型之间具有subtype关系。
详情参看 java se sepcification
Java中数组之间的类型转换
解释一下: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[]。

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

本文地址:https://blog.csdn.net/class_man/article/details/111998034

相关标签: java 编程语言