为什么阵列分配不兼容,即使它们的数据类型是?

404*_*und 3 java pointers casting pass-by-reference

byte b =10;   
int a = b;   // Primitive data type widening
             // Works perfectly fine
Run Code Online (Sandbox Code Playgroud)

上面的代码不会给出任何错误/警告.但为什么同样不适用于下面提到的代码?

byte[] b = new byte[10];
int[] i1 = b;             //Cannot convert from byte[] to int[]
int[] i2 = new byte[10];  //Cannot convert from byte[] to int[]
Run Code Online (Sandbox Code Playgroud)

我的问题是,因为int可以保存任何和所有字节值,为什么这不是数组的情况?

他们都在拿着地址.如果这对于ref变量是可能的,那么这将是向上的.

Era*_*ran 8

创建的数组new byte[10]可以包含10个byte值.如果您能够将其分配给类型的变量int[],编译器将(错误地)假设您的bytes 数组可以包含10个int值.

请考虑以下代码,该代码无效:

byte[] b = new byte[10];
b[0] = 10000; // too large for byte
Run Code Online (Sandbox Code Playgroud)

以及以下代码,它们是有效的:

int[] i2 = new int[10];
i2[0] = 10000;
Run Code Online (Sandbox Code Playgroud)

如果int[] i2 = new byte[10];有效,编译器将允许您将类型存储int在变量中byte.

  • 很好的例子,但它可能会提示人们问为什么它适用于引用类型的数组(例如`Object [] objs = new String [10];`). (2认同)

And*_*ner 5

语言规范定义了第4.10.3节中数组类型之间的子类型:

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

  • 如果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[]

最终的项目符号("If P是基本类型......")表明该语言没有定义不同基元类型的数组之间的任何关系.唯一有效的作业是:

byte[] bs = new byte[10];

byte[] bs2 = bs;
Object obj = bs;
Cloneable cl = bs;
Serializable ser = bs;
Run Code Online (Sandbox Code Playgroud)

这并不能解释为什么会这样; 你必须问语言设计师.然而,像Eran所示的简单示例证明了为什么OP提出的做法不安全.

应该注意的是第一行 - 它允许赋值

Object[] obj = new String[10];
obj[0] = new Object();  // ArrayStoreException!
Run Code Online (Sandbox Code Playgroud)

是一个设计错误:数组是协变的,使它们不是类型安全的.这是强烈偏好泛型到数组的一个原因,因为泛型是不变的,因此阻止了这样的赋值.