【问题标题】:Storing same type but still getting an ArrayStoreException存储相同类型但仍然收到 ArrayStoreException
【发布时间】:2012-09-28 15:35:23
【问题描述】:

我有一个奇怪的问题。我有三个班。 Book (abstract) 和两个子类 (Fiction, Nonfiction)。我已经创建了一系列书籍参考。该数组可以包含两个子类的对象。我有以下小说类的代码。

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;

公共类主{

public static void main(String[] 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());

    }


}

}

出于任何原因,我在这条线上遇到了 ArrayStoreException ..

book[i] = new Nonfiction(title);

但相同的代码适用于 Fiction 类。我检查了 java 文档,它说当我尝试将不同的对象存储在数组中(如 String 和 Int )时会引发此异常,但在这种情况下它们都是相同的对象。这两个类都是超类的子类,也就是说,它们属于同一类型。我很困惑。请问这里有什么帮助吗?

【问题讨论】:

  • 请注意,即使是抽象类(或实例),您仍然可以构造该类型的新数组实例,例如新的可序列化[]。

标签: java


【解决方案1】:

您不能将Nonfiction 放在new Fiction[6] 中。

您被以下事实误导了:您可以将 Fictions 的数组分配给 Book[] 类型的变量(数组协方差)。
正如您所发现的那样,这是不可能的,因为 Fiction[] 不能被视为 Book[]。 (可变类型不能是协变的)

这是 Java 的设计缺陷。

【讨论】:

  • 是的。我把自己弄糊涂了。谢谢。
【解决方案2】:

替换这个:-

Book[] book = new Fiction[6];

有:-

Book[] book = new Book[6];

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

您在以下方面感到困惑:-

Book book = new Fiction();

 Book[] books = new Fiction[6];

【讨论】:

  • 天哪!你说的对。我真的很困惑。天哪,谢谢。我知道我不能那样做,但我很困惑自己。必须多加注意。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多