【问题标题】:Why is it an error such that the x is considered an Object even though it is referencing an array?为什么即使 x 引用了一个数组,它也被认为是一个 Object 是一个错误?
【发布时间】:2018-06-10 21:25:45
【问题描述】:

谁能帮我理解这段代码?

int[] A = new int[2];
Object x = A; // All references are Objects
A[0] = 0;     // Static type of A is array...
x[1] = 1;   // But static type of x is not an array: ERROR

根据 Oracle Java SE 网站:

在 Java 编程语言中,数组是对象(第 4.3.1 节),是动态创建的,并且可以分配给 Object 类型的变量(第 4.3.2 节)。 Object 类的所有方法都可以在数组上调用。

我知道可以将数组分配给Object 类型的变量,但是,我的困惑可能在于reference 的概念。当我们说Object x = A 时,我们是在说x 引用了数组A。然而,我的困惑在于x[1] = 1。为什么 x 被认为是 Object 是一个错误,即使它引用了一个数组?我是否认为[] 是一种只能在“数组”类中访问的方法?

【问题讨论】:

  • 虽然数组确实是对象,但并非所有对象都是数组。因此,如果它是一个数组,编译器将不允许您像数组一样进行索引。
  • 你需要了解变量类型和引用类型的区别。编译器只知道x是一个Object,不多也不少。
  • @HovercraftFullOfEels 所以你的意思是因为Object x 没有被定义为一个对象,所以它被认为是一个变量?因此,当我定义Object x = A 时,这是一个变量赋值而不是引用?
  • 什么?抱歉,我无法解析,因为您上面的陈述非常令人困惑和困惑。您需要研究什么是变量以及什么是引用,因为这些是您必须了解的关键概念。变量是赋值左边的东西。
  • Language Basics,特别是注意变量和对象。

标签: java arrays dynamic reference static


【解决方案1】:

虽然我不会不必要地丢弃类型信息,但您可以使用Array#setInt(Object, int, int) 通过Object 访问int[]。也就是说,

Array.setInt(x, 1, 1); // x[1] = 1;

会起作用的。

【讨论】:

    【解决方案2】:

    arrays are objects - 这意味着任何类型(引用或原始)的数组都是 Object 类的子类。

    • 通过使用父引用可以访问子类的实例。因此,Object x = A; 语句在语法上是正确的。
    • 通过使用子引用,可以访问子相关的方法/实现。因此,A[0] = 0; 语句在语法上是正确的。
    • 通过使用父引用,无法访问与子相关的方法/实现。因此,x[1] = 1; 语句在语法上是不正确的。

    【讨论】:

    • 那么我可以这样想“既然x没有数组的静态类型,所以x[1] = 1是不正确的,因为[]只有在动态类型是数组的情况下才有效?”
    • 我是说 ~x~ 不知道 ~[ ]~ 符号。通过使用强制转换或使用 java.util.Array 方法,您可以使其成为数组类型。
    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    相关资源
    最近更新 更多