我的问题是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问题])损害了我对协方差的理解。因为如果我们注意到[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
答案 0 :(得分:1)
根据JLS 4.10.3. Subtyping among Array Types (链接provided by JB Nizet):
以下规则定义了数组类型之间的直接超类型关系:
如果
S
和T
都是引用类型,则S[]
> 1T[]
如果S
> 1T
。
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[] {
}
更新
数组类型的成员如下:
public
final
字段length
,其中包含数组的组件数。length
可以为正或为零。
public
方法clone
,它将覆盖类Object
中相同名称的方法,并且不引发任何检查异常。数组类型为clone
的{{1}}方法的返回类型为T[]
。多维数组的克隆很浅,也就是说,它仅创建一个新数组。子数组是共享的。
所有从类
T[]
继承的成员;Object
唯一未被继承的方法是其Object
方法。
那意味着:
clone