Java中的铸造数组过程?(协方差和[LObject)



我的问题是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提供的链接(:

以下规则定义了数组类型之间的直接超类型关系:

  • 如果ST都是引用类型,则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。阵列成员说:

数组类型的成员都是以下类型的:

  • publicfinal字段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();
}
}

相关内容

  • 没有找到相关文章

最新更新