java – 为什么数组赋值不兼容,即使它们的数据类型是?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么数组赋值不兼容,即使它们的数据类型是?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1324字,纯文字阅读大概需要2分钟。
内容图文
![java – 为什么数组赋值不兼容,即使它们的数据类型是?](/upload/InfoBanner/zyjiaocheng/762/d49edacbc2b542928da6988319eb3238.jpg)
byte b =10;
int a = b; // Primitive data type widening
// Works perfectly fine
上面的代码不会给出任何错误/警告.但为什么同样不适用于下面提到的代码?
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[]
我的问题是,因为int可以保存任何和所有字节值,为什么这不是数组的情况?
他们都在拿着地址.如果这对于ref变量是可能的,那么这将是向上的.
解决方法:
语言规范定义了Sec 4.10.3中数组类型之间的子类型:
The following rules define the direct supertype relation among array
types:
If
S
andT
are both reference types, thenS[] >1 T[] iff S >1 T
.
Object >1 Object[]
Cloneable >1 Object[]
java.io.Serializable >1 Object[]
If
P
is a primitive type, then:
Object >1 P[]
Cloneable >1 P[]
java.io.Serializable >1 P[]
最后的项目符号(“如果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!
是一个设计错误:数组是协变的,使它们不是类型安全的.这是强烈偏好泛型到数组的一个原因,因为泛型是不变的,因此阻止了这样的赋值.
内容总结
以上是互联网集市为您收集整理的java – 为什么数组赋值不兼容,即使它们的数据类型是?全部内容,希望文章能够帮你解决java – 为什么数组赋值不兼容,即使它们的数据类型是?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。