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