Java中的对象类型和引用数组

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)
public class RefMix {
  public static void main(String[] args) {
    Object[] a = {null, "foo"};
    Object[] b = {"bar", b};
    a[0] = b;

    System.out.println(a[0][0]);
  }
}

我的理解是数组是Java中的对象,因此也是Object类型的一个子类。我进一步的理解是一个2-dim数组被实现为数组的引用数组。因此我不明白为什么我的a [0] [0]不会bar在上面的代码中产生。相反,它不会编译:

RefMix.java:7: array required, but java.lang.Object found
提问于
用户回答回答于

我的理解是数组是Java中的对象,因此也是Object类型的一个子类。我进一步的理解是一个2-dim数组被实现为数组的引用数组。

这是完全正确的,并解释了为什么你可以完成这项任务

a[0] = b;

没有任何编译器的抱怨。

因此我不明白为什么我的a [0] [0]不会在上面的代码中生成条形图。

好的,我们来看看这个表达式中的类型:

  • a是一个Object[]- 这是一个Objects 的数组
  • a[0] 是一个 Object
  • a[0][0]- 现在你正试图在一个数组上使用数组下标Object。编译器不知道它Object实际上是一个数组,所以它抱怨。
用户回答回答于

对象实例的运行时类型与静态推断类型不同。编译器会尝试估计每个变量可能在程序中的类型,以便尽早捕获某些类型的错误。在这种情况下,a[0]将永远是一个数组,但编译器不知道这一点。由于您正在从对象数组中获取对象,因此所有编译器都知道这a[0]是一个对象。因此它会产生一个错误。

在知道某些东西总是某种类型但编译器无法解决的情况下,可以通过插入明确的转换来解决此问题。

System.out.println(((Object[])a[0])[0]);

扫码关注云+社区