Java 为什么数组不被视为集合的子类型?

Java 为什么数组不被视为集合的子类型?,java,arrays,collections,Java,Arrays,Collections,Java中的数组不扩展集合有什么好的理由吗 在使用(Object元素:someObject)对集合进行迭代之前,能够测试集合的someObject实例似乎很有用。相反,据我所知,知道对象是否是数组的唯一方法是在每种数组类型上使用instanceof(对象[],int[],双[],…)或使用someObject.getClass().isArray()但这当然也会强制执行空检查。数组的级别比集合低得多;有些集合通过数组(如ArrayList或Vector)进行抽象,但本机数组只是一个(受保护的、定

Java中的数组不扩展集合有什么好的理由吗


在使用(Object元素:someObject)对集合进行迭代之前,能够测试集合的
someObject实例似乎很有用。相反,据我所知,知道对象是否是数组的唯一方法是在每种数组类型上使用
instanceof
对象[]
int[]
双[]
,…)或使用
someObject.getClass().isArray()
但这当然也会强制执行空检查。

数组的级别比集合低得多;有些集合通过数组(如ArrayList或Vector)进行抽象,但本机数组只是一个(受保护的、定义良好的)内存块,您可以在其上构建自己的抽象

为什么这对你来说是个问题


顺便说一句,
foreach
循环也可以对数组进行操作,在这种情况下,它只是扩展为一个索引
for
表达式

Java中的数组是通过JVM中的专用指令实现的。他们是系统中独立的一流成员,而不是传统意义上的阶级。为了允许在数组上使用专门的语法,它们必须是

有两种特殊情况:空引用和对基元数组的引用

null引用将导致instanceof结果为false,而isArray将抛出
NullPointerException


应用于基元数组时,
instanceof
的结果为false,但
isArray()
返回true。

实际上有很多原因

  • 集合是类型安全的;数组不可用。由于数组的“伪”协方差,运行时可能会导致ArrayStoreException

  • 列表或集合的equals、hashCode和toString方法满足用户的期望;数组中的这些方法所做的一切都不是您所期望的——这是常见的bug源

  • 集合可以是线程安全的;甚至是并发的。一个数组发布到多个线程永远都不安全

  • 集合可以是可变的,也可以是不可变的。非空数组必须始终是可变的


欲了解更多详细信息,请阅读:

简短回答:从长远来看,数组早于集合。形式为“语言设计师为什么做出决策X”的问题实际上是基于观点的。唯一具体的答案可以在语言规范中找到(如果作者解释了他们的选择),或者直接询问设计师。在这种情况下,很可能是希望以一种不足为奇的方式容纳现有的概念?或者,更好的是,让
someObject.getClass().isArray()
抛出
NullPointerException
有什么不对?