1

奇妙な問題があります。私には3つのクラスがあります。本(要約)、および2つのサブクラス(フィクション、ノンフィクション)。ブックリファレンスの配列を作成しました。その配列は、両方のサブクラスのオブジェクトを保持できます。私はフィクションクラスの次のコードを持っています。

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など)を格納しようとするとこの例外がスローされると書かれていますが、この場合、それらはすべて同じオブジェクトです。どちらのクラスもスーパークラスの子です。つまり、同じタイプです。私は告白されています。ここで少し助けてください?

4

2 に答える 2

4

を入れることはできませNonfictionnew Fiction[6]

Fictionsの配列を型の変数Book[](配列共分散)に割り当てることができるという事実に惑わされています。
あなたが発見したように、それは可能ではないはずです。なぜなら、Fiction[]はとして扱うことができないからBook[]です。(可変型は共変にすることはできません)

これはJavaの設計上の欠陥です。

于 2012-09-28T15:36:36.357 に答える
0

これを置き換えます: -

Book[] book = new Fiction[6];

と : -

Book[] book = new Book[6];

Array宣言の最初の方法を使用することにより、実際には、タイプのオブジェクトを含みFiction、他のサブタイプを含まないことをコンパイラに伝えています。Book

あなたは以下の間で混乱しています: -

Book book = new Fiction();

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