Java中数组之间的类型转换
一、引出问题
有时我们会看见这样的代码
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关系的数据类型也是可以的。
相信小伙伴们一定发现关键点在于subclass和subtype问题上,实际上 Barbara Liskov的讲义就在阐述这两个内容。
长篇大论太难为我们了,这里借用*里面的一个回答做一个简单的辨析,可能不太准确。
总之,我们需要知道的就是,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[]。
觉得有帮助请点个赞,发现错误也欢迎指出。
本文地址:https://blog.csdn.net/class_man/article/details/111998034
上一篇: 最佳香港主机推荐—主机91