语言规范在Sec
4.10.3中定义了数组类型之间的子类型化:
以下规则定义了数组类型之间的直接超类型关系:
如果
S和T都是引用类型,则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[]
最后的项目符号(“ If
P是原始类型…”)表明该语言未定义不同原始类型的数组之间的任何关系。唯一有效的分配是:
byte[] bs = new byte[10];byte[] bs2 = bs;Object obj = bs;Cloneable cl = bs;Serializable ser = bs;
这没有提供 为什么
这样的答案。您必须要询问语言设计师。但是,像Eran所示的简单示例说明了为什么按照OP的建议这样做并不安全。
应该注意的是,第一行-允许类似
Object[] obj = new String[10];obj[0] = new Object(); // ArrayStoreException!
是一个设计错误:数组是协变的,因此它们不是类型安全的。这是强烈建议使用泛型而不是数组的原因之一,因为泛型是 不变的 ,因此可以防止此类分配。



