Java 存储相同类型但仍获取ArrayStoreException

Java 存储相同类型但仍获取ArrayStoreException,java,Java,我有个奇怪的问题。我有三节课。书籍(摘要)和两个子类(小说、非小说类)。我已经创建了一系列参考书。该数组可以容纳两个子类的对象。我有以下小说课的代码 public class Fiction extends Book{ public Fiction(String title) { super(title); setPrice(); } public void setPrice() { super.price = 24.99; } } 和非小说类的“相同”代码

我有个奇怪的问题。我有三节课。书籍(摘要)和两个子类(小说、非小说类)。我已经创建了一系列参考书。该数组可以容纳两个子类的对象。我有以下小说课的代码

public class Fiction extends Book{

public Fiction(String title) {
    super(title);

    setPrice();
}

public void setPrice() {

    super.price = 24.99;

}
}

和非小说类的“相同”代码

public class Nonfiction extends Book{

public Nonfiction(String title) {
    super(title);

    setPrice();
}

public void setPrice() {

    super.price = 37.99;

}
}

这是主程序

import javax.swing.JOptionPane;
公共班机{

公共静态void main(字符串[]args){


但同样的代码也适用于虚构类。我查看了java文档,它说当我试图在数组中存储不同的对象(如字符串和Int)时会引发此异常,但在本例中,它们都是相同的对象。这两个类都是超类的子类,也就是说,它们属于同一类型。我很抱歉。请在此提供一些帮助?

您不能将
非小说类
放在
新小说[6]

你被这样一个事实误导了:你可以将
虚构的
数组分配给
Book[]
类型的变量(数组协方差)。
正如您所发现的,这是不可能的,因为
小说[]
不能被视为
书籍[]
(可变类型不能是协变的)


这是Java中的一个设计缺陷。

您不能将
非虚构的
放在
新小说[6]

你被这样一个事实误导了:你可以将
虚构的
数组分配给
Book[]
类型的变量(数组协方差)。
正如您所发现的,这是不可能的,因为
小说[]
不能被视为
书籍[]
(可变类型不能是协变的)

这是Java中的一个设计缺陷。

替换此:

Book[] book = new Fiction[6];
附:-

Book[] book = new Book[6];
通过使用第一种声明方式,您实际上是在告诉编译器
数组
将包含
虚构
类型的对象,而不是
书籍
的任何其他子类型

你把自己弄糊涂了:-

Book book = new Fiction();

替换此项:-

Book[] book = new Fiction[6];
附:-

Book[] book = new Book[6];
通过使用第一种声明方式,您实际上是在告诉编译器
数组
将包含
虚构
类型的对象,而不是
书籍
的任何其他子类型

你把自己弄糊涂了:-

Book book = new Fiction();


请注意,即使类是抽象的(或实例),您仍然可以构造该类型的新数组实例,例如new Serializable[]。请注意,即使类是抽象的(或实例),您仍然可以构造该类型的新数组实例,例如new Serializable[]哦,上帝!你是对的。我真的把自己弄糊涂了。天哪,谢谢。我知道我不能那样做,但我把自己弄糊涂了。必须多加注意。谢谢上帝!你是对的。我真的把自己弄糊涂了。天哪,谢谢。我知道我不能那样做,但我把自己弄糊涂了。必须多加注意。谢谢。我把自己弄糊涂了。谢谢。真的。我参与了谢谢我自己。