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变量是可能的,那么这将是向上的.
创建的数组new byte[10]
可以包含10个byte
值.如果您能够将其分配给类型的变量int[]
,编译器将(错误地)假设您的byte
s 数组可以包含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
.
语言规范定义了第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;
Run Code Online (Sandbox Code Playgroud)
这并不能解释为什么会这样; 你必须问语言设计师.然而,像Eran所示的简单示例证明了为什么OP提出的做法不安全.
应该注意的是第一行 - 它允许赋值
Object[] obj = new String[10];
obj[0] = new Object(); // ArrayStoreException!
Run Code Online (Sandbox Code Playgroud)
是一个设计错误:数组是协变的,使它们不是类型安全的.这是强烈偏好泛型到数组的一个原因,因为泛型是不变的,因此阻止了这样的赋值.
归档时间: |
|
查看次数: |
153 次 |
最近记录: |