我的问题是Java中的转换过程到底是如何的?假设我们有
User[] users = new User[2];//<-- here we get at runtime [LUser class
Object[] objects = (Object[]) users;//<-- here we get at runtime [LObject class
public class [LUser extends Object implements Serializable, Cloneable{
}
public class [LObject extends Object implements Serializable, Cloneable{
}
我知道,由于数组的协方差,User是Object,User[]也是Object[]。但是关于类创建的解释([LUser和[LObject问题(损害了我对协方差的理解
User[] users = new User[2];
Object[] objects = (Object[]) users;
//<-- here we cast [LUser to [LObject but [LUser doesn't extends [Lobject
那个么铸造过程到底是怎样的呢?也许问题看起来很疯狂,但从逻辑上讲,我得到了这个结果。在最坏的情况下,我可以认为Java在语法上将User[]转换为Object[],但当时我们为什么需要像[LObject,[LUser-这样的对象创建
根据JLS 4.10.3。数组类型之间的子类型(JB Nizet提供的链接(:
以下规则定义了数组类型之间的直接超类型关系:
如果
S
和T
都是引用类型,则S[]
>1T[]
iffS
>1CCD_ 6。
Object
>1Object[]
Cloneable
>1Object[]
java.io.Serializable
>1Object[]
以上的意思如下。当然你不能写,但这是Java中数组子类型规则的等价物。
// Rule #2 Rule #3 Rule #4
class Object[] extends Object implements Cloneable, Serializable {
}
// Rule #1
class User[] extends Object[] {
}
更新
此外,JLS 10.7。阵列成员说:
数组类型的成员都是以下类型的:
public
final
字段length
,它包含数组的组件数。CCD_ 16可以是正的或零。
public
方法clone
覆盖类Object
中的同名方法,并且不抛出已检查的异常。数组类型T[]
的clone
方法的返回类型为T[]
。多维数组的克隆是浅的,也就是说它只创建一个新数组。子阵列是共享的。
继承自
Object
类的所有成员;CCD_ 24唯一未被继承的方法是其CCD_。
这意味着:
class Object[] extends Object implements Cloneable, Serializable {
public final int length = /*value from array creation*/;
public Object[] clone() {
try {
return (Object[]) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e.getMessage());
}
}
}
class User[] extends Object[] {
public User[] clone() {
return (User[]) super.clone();
}
}