【GHS】Java中数组之间的类型转换

2670459508   ·   发表于 9个月前   ·   编程代码

一、引出问题
有时我们会看见这样的代码

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的讲义就在阐述这两个内容。

长篇大论太难为我们了,这里借用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[]。
2 Reply   |  Until 8个月前 | 3942 View

klmk
发表于 8个月前

小胖,元旦快乐嗷[滑稽]

评论列表

  • 加载数据中...

编写评论内容

十六夜.
发表于 8个月前

还葫芦来了哦

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content
程序耗时 0.027秒 内存:1361KB