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

2022-09-03 09:11:21
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

答案 1

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

这一切都是正确的,并解释了为什么你可以做这个任务

a[0] = b;

没有编译器的任何抱怨。

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

好吧,让我们看一下此表达式中的类型:

  • a是一个 -- 即 s 的数组Object[]Object
  • a[0]是一个Object
  • a[0][0]-- 现在您正在尝试在 .编译器不知道 实际上是一个数组,所以它抱怨。ObjectObject

答案 2

对象实例的运行时类型不同于静态推断的类型。编译器将尝试估计程序中每个变量的类型,以便及早捕获某些类型的错误。在这种情况下,将始终是一个数组,但编译器不知道这一点。由于您是从对象数组中获取对象,因此编译器只知道它是一个对象。因此,它会引发错误。a[0]a[0]

如果你知道某些东西总是某种类型,但编译器无法弄清楚,你可以通过插入显式强制转换来解决这个问题。

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