当前位置: 首页 > 面试题库 >

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

司徒浩思
2023-03-14
问题内容
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中
定义了数组类型之间的子类型化:

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

  • 如果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;

这没有提供 为什么
这样的答案。您必须要询问语言设计师。但是,像Eran所示的简单示例说明了为什么按照OP的建议这样做并不安全。

应该注意的是,第一行-允许类似

Object[] obj = new String[10];
obj[0] = new Object();  // ArrayStoreException!

是一个设计错误:数组是协变的,因此它们不是类型安全的。这是强烈建议使用泛型而不是数组的原因之一,因为泛型是 不变的 ,因此可以防止此类分配。



 类似资料:
  • 以下是这个问题,它提供了一个解决方案,但没有解释它(不幸的是,答案中的链接现在没有了): WTF???在上调用返回一个,该不能赋值给类型为的变量,但可以赋值给类型为的变量?扩展Map.Entry >????? 有人能说说这是怎么回事吗?这是否意味着,每当我使用至少2层深度的通配符类型编写方法时,我都必须记住将其设置为在什么地方?

  • 我按照这个教程:https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer 现在我在这一点上: 我的问题是这条线... 显示一个错误:不兼容的类型。需要android。应用程序。FragmentManager发现:android。支持v4.app。碎片管理器。 我看到了一些帖子,但它们不适合我。 我用AppC

  • 我的函数类似于以下简化代码示例: 当我运行Mypy(版本0.52)我得到这个错误: 错误指向代码示例中的倒数第二行。为什么mypy返回此错误?我的代码是无效的(以任何方式)还是一些mypy错误?

  • 这是我的代码: 爪哇说: File.java:[92,141]不兼容的类型:java.lang.对象不能转换为捕获#1?扩展java.lang.对象 列141是中的。 为什么这个不会编译?

  • 我定义jackoson序列化器并将其添加到java类中,如下所示: 编译器出现以下错误: 注释的定义为: 如果我从ReportFilterDeserializer中删除泛型attibute,它将通过编译。我不明白编辑为什么抱怨。

  • 我正在使用JPA,列类型为: 我使用PostgreSql作为我的数据库,它支持bpchar类型,现在我尝试为我的测试添加H2,但问题是,当我运行测试时,我得到以下结果: 是否有其他方法可以实现这一目标?