1

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

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;

公共类主要{

公共静态无效主要(字符串[]参数){

    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 )时会引发此异常,但在这种情况下它们都是相同的对象。两个类都是超类的子类,也就是说,它们属于同一类型。我很困惑。请问这里有一点帮助吗?

4

2 回答 2

4

你不能把 a 放在 aNonfictionnew Fiction[6]

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

这是Java中的设计缺陷。

于 2012-09-28T15:36:36.357 回答
0

替换这个: -

Book[] book = new Fiction[6];

和 : -

Book[] book = new Book[6];

By using first way of declaration, you are actually telling compiler that Array will contain object of type Fiction and not any other subtype of Book

You have confused yourself between: -

Book book = new Fiction();

and

 Book[] books = new Fiction[6];
于 2012-09-28T15:38:40.500 回答