用Java转换数组过程? (协方差和[LObject]

时间:2018-07-19 22:29:05

标签: 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, 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

1 个答案:

答案 0 :(得分:1)

根据JLS 4.10.3. Subtyping among Array Types (链接provided by JB Nizet

  

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

     
      
  • 如果ST都是引用类型,则S[]> 1 T[]如果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[] {
}

更新

此外,JLS 10.7. Array Members说:

  

数组类型的成员如下:

     
      
  • public final字段length,其中包含数组的组件数。 length可以为正或为零。

  •   
  • public方法clone,它将覆盖类Object中相同名称的方法,并且不引发任何检查异常。数组类型为clone的{​​{1}}方法的返回类型为T[]

         

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

  •   
  • 所有从类T[]继承的成员; Object唯一未被继承的方法是其Object方法。

  •   

那意味着:

clone