加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么数组赋值不兼容,即使它们的数据类型是?

发布时间:2020-12-15 05:14:49 所属栏目:Java 来源:网络整理
导读: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 b
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 and T are both reference types,then S[] >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!

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读