java - 尝试将数组的元素设置为父类(super class)对象时出现 ArrayStoreException

标签 java arrays object memory compiler-construction

class A {}
class B extends A {}

嗨,我正在学习 Java,我试图理解为什么这是有效的:

A[] tab = new A[10];
tab[0] = new B();

而不是这个:

A[] tab = new B[10];
tab[0] = new A();

这行A[] tab = new B[10];表示编译器在内存中为B预留了10个位置。 tab[0] = new A()tab[0] 设置为等于新的 A 对象,该对象小于 (?) B(B扩展A)。

为什么会出现 ArrayStoreException: A 错误?它是如何工作的?

最佳答案

您可以在该对象内部存储该对象的子类。即B可以存储在A中,但是AB类型的父类(super class)。基本上,继承链中类 X 下面的任何类都可以称为类型 X,但继承链中类 X 上面的任何类都可以称为类型 X不能被称为类型 X

你的例子

A[] tab = new A[10]; // Perfectly fine. Equal objects.
tab[0] = new B(); // B is a subclass of A, so this is allowed.

A[] tab = new B[10]; // Same principle as above, B is a subclass of A
tab[0] = new A(); // A is a SUPERCLASS of B, so it can not be referred to as A

简而言之,如果XY的子类,则X只能被称为Y 。 (或者子类的子类。这是一个递归定义)。

让我们使用一些英语术语

让我们使用 ItemBook,而不是 AB

public class Item {}

public class Book extends Item {}

现在,可以说:

Item b = new Book(); // All Books are items.

这样说是没有意义的:

Book b = new Item(); // All items are definitely not books.

关于java - 尝试将数组的元素设置为父类(super class)对象时出现 ArrayStoreException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16914132/

相关文章:

java - 使用 spring security 和 oauth2 刷新 token 调用失败,错误为 : UserDetailsService is required

javascript - 如何从没有索引的数组中检索值

arrays - 按顺序连接数组元素 PostgreSQL

使用 C 从另外两个数组中的最小整数创建第三个数组

java - 继承和调用方法(实例与非实例)

javascript - 在 JavaScript 对象中按值查找

Javascript:确定数组中的所有元素是否都是对象中的键

java - Java 中多线程同步不起作用

java - 在 Textview 中以千位分隔符和小数格式显示数字

java - 疯狂的 MS SQL Server JDBC 驱动程序在日期时间字段或时区问题?