gpt4 book ai didi

java - 允许将整数分配给对象,但不允许将整数数组分配给对象数组?

转载 作者:行者123 更新时间:2023-11-30 02:49:25 25 4
gpt4 key购买 nike

我正在阅读如何将子类对象分配给父类容器。有 3 种情况,如下所示。适用于集合、数组和普通对象。我对这三种情况感到困惑,这三种情况如何以及为什么这三种情况在 Java 中的处理方式有所不同。请问以下场景有简单的解释吗?它们似乎是非常基本的 java 概念,不知道为什么让我感到困惑。

  1. 这会导致编译时错误。

    List<Object> objectList = new ArrayList<Integer>();//compile time error
  2. 但是,这是允许的

    Object object = new Integer(9);
    object = 1.2;// no run time error
  3. 但这不是吗? (虽然,技术上编译器允许,但我们收到运行时错误)

    Object objectArr[] = new Integer[1];
    objectArr[0] = 1.2;// run time error (Exception in thread "main" java.lang.ArrayStoreException: java.lang.Double)

最佳答案

如果 A 是 B 的子类型,则可以将 A 类型的某些内容分配给 B 类型的变量。从广义上讲,对于非基本类型,这意味着 A 必须支持以下操作: B 确实如此。

看看你的例子:

第一:

List<Object> objectList = new ArrayList<Integer>();//compile time error

对,因为 ArrayList<Integer>不是List<Object> ;您不能添加Object到它。考虑:

List<Object> l = new ArrayList<Object>();
List<Integer> l2 = new ArrayList<Integer>();
l.add(new Object()); // ok
l2.add(new Object()); // not ok; `List<Integer>` doesn't support this.

所以你看到一个 List<Integer> (或 ArrayList<Integer> )不是 List<Object> 的子类型- 因为它不支持所有相同的操作。

下一个:

Object object = new Integer(9);
object = 1.2;// no run time error

在本例中,值 1.2自动装箱为包装类型 Double (全名java.lang.Double)。因为这是 Object 的子类然后作业就可以正常工作了。变量object中存储了什么不是原始的double值 1.2,而是对 Double 的引用包装原始值的对象。

最后:

Object objectArr[] = new Integer[1];
objectArr[0] = 1.2;// run time error (Exception in thread "main" java.lang.ArrayStoreException: java.lang.Double)

这是一个奇怪的案例。 Java 考虑 Integer 的数组是 Object 数组的子类型,但根据正常类型理论,情况并非如此,因为您无法存储 Object (这也不是 Integer )进入这样的数组。另一方面,Integer 的数组至少支持 Object 数组的所有其他操作确实 - 您可以检索元素并确保它们是 Object 的子类型;您可以检查数组长度;因此,您可以分配 new Integer[1] - 一个Integer数组 - 到 Object[] 类型的变量.

为了使这种形式的子类型起作用,Integer数组需要实现类似于 Object 的“存储 Object[] 元素”操作隐含地支持。自 Integer[]应该只包含 Integer但是,存储操作必须失败 - 因此,如果您尝试存储不是 Integer 的内容,则会在运行时出现异常。 。在您的示例中,您存储 1.2它被自动装箱到 Double ,不是 Integer .

关于java - 允许将整数分配给对象,但不允许将整数数组分配给对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39179060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com