存储相同类型但仍然获得ArrayStoreException

时间:2012-09-28 15:35:24

标签: java

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

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 class Main {

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)时抛出此异常,但在这种情况下它们都是相同的对象。这两个类都是超类的子类,这意味着它们属于同一类型。我很生气。请稍微帮忙吗?

2 个答案:

答案 0 :(得分:4)

您无法将Nonfiction放入new Fiction[6]

您可能会被Fiction的数组分配给Book[]类型的变量(数组协方差)。 正如您所发现的那样,这是不可能的,因为Fiction[]不能被视为Book[]。 (可变类型不能协变)

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

答案 1 :(得分:0)

替换它: -

Book[] book = new Fiction[6];

用: -

Book[] book = new Book[6];

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

的任何其他子类型

你在以下之间感到困惑: -

Book book = new Fiction();

 Book[] books = new Fiction[6];