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

Java中的铸造数组过程?(协方差和[LObject),java,arrays,covariance,Java,Arrays,Covariance,我的问题是,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, Cl

我的问题是,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[]users=新用户[2];//根据(链接):

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

  • 如果
    S
    T
    都是引用类型,则
    S[]
    >1
    T[]
    iff
    S
    >1
    T

  • Object
    >1
    Object[]

  • Cloneable
    >1
    Object[]

  • java.io.Serializable
    >1
    Object[]

上面的意思是,当然你不能写,但是这是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
    ,该方法重写类
    对象中同名的方法,并且不抛出任何选中的异常。数组类型
    T[]
    clone
    方法的返回类型为
    T[]

    多维数组的克隆是浅层的,也就是说它只创建一个新数组。子数组是共享的

  • 从类
    对象
    继承的所有成员;
    对象
    唯一未继承的方法是其
    克隆
    方法

这意味着:

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();
    }
}

“这里我们在运行时得到[LObject类”你说的“得到”是什么意思?强制转换不会改变对象的类型:
users
仍然具体地说是一个
User[]
,因此
objects
具体地说是一个
User[]
也是。数组是特殊的。它们不像任何其他类那样是类。它们有特定的规则来决定它们的行为。可能是@Sarkhan的重复我真的不知道你在问什么。这表明强制转换不会改变具体的类型。@Sarkhan但是,正如我在第一篇评论中所说,数组不像普通类那样工作。它们有仅适用于它们的特定规则。字符串数组是String[]的实例,也是CharSequence[]的实例,也是Serializable[]的实例,也是Cloneable[]的实例,也是Object[]的实例.对于只有一个超类的常规类,这是不可能的。只有数组。这就是我想要的答案!
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();
    }
}