为什么Object [] .class.isAssignableFrom(String [] .class)== true?

Bro*_*die 3 java arrays jvm

为什么Object[].class.isAssignableFrom(String[].class) == true,有String[].getSuperClass()getGenericInterfaces()无法得到Object[]

我检查了JDK的来源,但我认为我自己无法得到答案.现在,我知道JDK使用树来存储类之间的关系,并使用深度来指示它的级别,Class::isAssignableFrom()搜索链,所以绝对数组在那个树中.并且还String[]连接到Object[].

我可以说那String[]是一个子类Object[]吗?或者它只是Java的另一个奇怪的东西?

Joa*_*uer 6

Class.isAssignableFrom()基本上检查子类型关系."subtype"和"subclass"是两个不同的概念.类层次结构(即子类化)只是子类型的一部分.

基元类型数组类型具有子类型的特殊情况.

数组类型的子类型规则是这样的(注意"> 1 "表示"是一个直接的子类型"):

  • 如果ST都是引用类型,那么S[]> 1 T[] iff S> 1 T.
  • Object> 1 Object[]
  • Cloneable> 1 Object[]
  • java.io.Serializable> 1 Object[]
  • 如果p是原始类型,则:
    • Object> 1 p[]
    • Cloneable> 1 p[]
    • java.io.Serializable> 1 p[]

您的问题的重要部分是第一项:当且仅当组件类型是组件类型的子类型时,数组类型X[]是数组类型的子类型.Y[]XY

另请注意,严格来说既不是课程Object[]也不String[]是课程.它们是"唯一"类型.虽然每个类隐式都是一个类型,但事实并非如此.这不是类类型的另一个例子是基本类型:boolean,byte,char,short,int,long,floatdouble是类型,但它们不是类.

造成混淆的另一个原因是您可以轻松获取java.lang.Class表示这些类型的对象.还是那句话:这并不能意味着这些类型的类.