当前位置: 首页 > 知识库问答 >
问题:

存储相同类型但仍获得ArrayStoreException

阎俊英
2023-03-14

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

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){

    Book[] book = new Fiction[6];

    for(int i = 0; i<book.length; i++) {

        if(i<4) {
            String title = JOptionPane.showInputDialog("Enter fiction book, no "+i);
            book[i] = new Fiction(title);

        } else {

            String title = JOptionPane.showInputDialog("Enter non fiction book, no "+i);
            book[i] = new Nonfiction(title);

        }

    }

    for(int x = 0; x<book.length; x++) {

        System.out.println("Book named "+book[x].getTitle()+" costs "+book[x].getPrice());

    }


}

}

出于任何原因,我在这一行得到ArrayStore异常...

book[i] = new Nonfiction(title);

但同样的代码也适用于小说类。我查看了java文档,它说当我试图在数组中存储不同的对象(比如String和Int)时会抛出这个异常,但在本例中,它们都是相同的对象。这两个类都是超类的子类,也就是说,它们属于同一类型。我被起诉了。请帮我一点忙好吗?

共有2个答案

齐永昌
2023-03-14

替换这个:-

Book[] book = new Fiction[6];

与:-

Book[] book = new Book[6];

通过使用第一种声明方式,您实际上是在告诉编译器Array将包含虚构类型的对象,而不是Book的任何其他子类型

你把自己混淆在:-

Book book = new Fiction();

 Book[] books = new Fiction[6];
吕成业
2023-03-14

你不能把非小说放在新小说[6]中。

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

这是Java的设计缺陷。

 类似资料:
  • 因此,我正在创建一个用户API,并尝试在登录前调用getUserByEmail()。我的问题是,我得到了一个不明确的处理程序方法映射为HTTP路径错误。 我知道我的问题与我有一个相同但参数类型不同的GET有关。任何帮助都将不胜感激!

  • 问题内容: 我有一个Animal类和一个名为AnimalExtension的Animal扩展。 这两个类之间的唯一区别是AnimalExtension还有另一个实例变量叫做animalId。Animal没有此实例变量。 我也有自己的数据类型,想要对XML进行封送处理。此数据类型称为AnimalList。在AnimalList内,有一个Animals列表作为实例变量。 animalList可以包含A

  • 问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文

  • 但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会

  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 背景:对于我的用户,我需要存储一对相同的对象类型(设置),目前我有它像 我正在创建带有设置的KeyValueTypes,并将其添加到列表中(每个用户都有一个列表)。我的设置有一个值字段(它显示了它们是否比其他设置“更重要”),所以我希望基于该字段添加它们,稍后我还需要基于该字段(可能还需要基于名称字段)进行搜索--所以搜索将不得不在列表中查找,然后在KeyValueTypes中查找 问题:什么是最