【问题标题】:How can String array references be stored in the reference variables of Object array?String 数组引用如何存储在 Object 数组的引用变量中?
【发布时间】:2020-09-11 17:09:11
【问题描述】:

请看下面的代码。

class Use
{

    public static void main(String[] args)
    {
        String[] result = new String[2];//{"Hello", "World"}; // compiles and run
        Object[] name = result; // compiles and run
    //  result = name; //CE
        System.out.println(result);
        System.out.println(name);
    }
}

我的理解是Java中的数组是独立的对象,没有父子关系。所以在我看来,“结果”和“名称”是两种完全不同类型的对象(即 String[] 和 Object[])的引用变量,它们没有任何关系。那么

  1. 为什么语句“Object[] name = result;”没有错误?
  2. 为什么语句“result = name;”中有错误?
  3. 我知道“对象”和“字符串”有父子关系。 “Object[]”和“String[]”有什么关系吗?

【问题讨论】:

  • 如果我做name = new Integer[]{1}; result = name;怎么办? Object[] 不是 String[]
  • 'Object[] name = new Integer[]{1};` 是合法的,因为 Integer 继承自 Object。 Object[] 数组与String[] 数组不同。
  • 除了搜索关于 SO 的现有问题和答案外,您还可以在 Java 语言规范 中找到问题的明确答案,docs.oracle.com/javase/specs/index.html .
  • 不要忘记接受答案,并在回答您的问题时投票。这样,您的问题就不再显示为未回答。

标签: java arrays type-conversion typecasting-operator


【解决方案1】:

result = name 正在尝试将 Object 数组分配给 String 数组。您不能将 Object 分配给声明为 String 的变量,数组也是如此。您不能将数组分配给声明为不同类型数组的变量。

Object[] name = result 是合法的,因为所有对象都继承自 Object 类,包括 String。如果您分配的内容继承或实现了您分配给的变量的数据类型,您可以为声明的变量分配不同的数据类型。

为了更好地理解,请查看 Java 语言的文档。这是查看不同类之间关系的绝佳资源。

对象类文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

字符串类文档:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

整数类文档:https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html

【讨论】:

  • 谢谢。我知道“对象”和“字符串”有父子关系。 “Object[]”和“String[]”之间有什么关系吗?
  • 对象数组之间的关系反映了原始对象。原始数组只是一种内存结构,它们本身并不是一个类。
【解决方案2】:

java.lang.Object 类是所有 Java 类的超级基类。 我想这可以解决您的困惑。 (如果 B 扩展了 C,则意味着 B 是 C 而不是 C 是 B。)

result = name; 抛出编译错误,因为它们属于不同类型。您需要强制转换它以避免编译错误。

result = (String[]) name;

如果换一种方式,name=result 会起作用,因为可以将 String[] 分配给 Object[];反之亦然。

https://javapapers.com/java/why-object-is-super-class-in-java/

【讨论】:

  • 我知道“对象”和“字符串”有父子关系。 “Object[]”和“String[]”之间有什么关系吗?
【解决方案3】:

String数组引用如何存储在Object数组的引用变量中?

我知道“对象”和“字符串”有父子关系。 “Object[]”和“String[]”有什么关系吗?

根据JLS Section 4.10.3. Subtyping among Array TypesString[]Object[],因为StringObject,因此Object[] name = result; 是合法的。

为什么语句“result = name;”有错误?

鉴于上述情况,Object[]不是String[],这就是为什么您会在编译时收到此错误。

Error:(13, 26) java: incompatible types: java.lang.Object[] cannot be converted to java.lang.String[]

(毕竟,对象数组Object[] 可以包含任何引用类型的元素,例如StringInteger 等)

但是,根据您的代码“您知道”,实际上这个 Object[] name 数组只包含 Strings。所以Object[] name 实际上是一个String[]。因此,您可以通过显式使用向下转换来使其工作,即result = (String[]) name

通过使用向下转换,您可以向编译器明确声明这种类型转换很好(因为一般情况下不会这样)。然后你是否应该通过这样做来打破你的代码中的“你的承诺”

String[] strings = {"Hello", "World"};
Object[] objects = strings;
objects[0] = 1; // let's replace the string with an integer
strings = (String[]) objects;

您将在运行时收到此异常。

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2014-10-16
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多