0

重複の可能性:
List<Dog> は List<Animal> のサブクラスですか? Java のジェネリックが暗黙のうちにポリモーフィックではないのはなぜですか?

これらのクラスを宣言しました:

class Cereal{}

と:

public class Flakes extends Cereal{
    public static void main(String[] args) {
       List<Cereal> newList = new ArrayList<Flakes>();
    }
}

しかし、これらの Java ソース コードをコンパイルしようとすると、次のコンパイル エラーが表示されます。

Type mismatch: cannot convert from ArrayList<Flakes> to List<Cereal>

私の質問は次のとおりです。なぜその変換ができないのですか? タイプセーフルールに違反していますか?または?

ご回答ありがとうございます。

4

3 に答える 3

2

定義されていない限り、型は固定されているためです。以下を試してみたい:

     List<? extends Cereal> newList = new ArrayList<Flakes>();

これは、そのリスト オブジェクトが拡張Cerealされ、上記のステートメントが有効になることを意味します。

于 2012-12-13T21:23:28.940 に答える
2

一言: Polymorphismには当てはまりませんgeneric type arguments

ただし、Cereal を上限として指定するワイルドカードを使用できます。

List<? extends Cereal> list = new Arraylist<Flakes>();

現在、このリストはシリアルであるすべてのものを受け入れますが、null 以外は何も追加できないことに注意してください。

List<? super Flakes> list = new ArrayList<Cereal>();

このリストは、Flakes および Flakes のスーパー タイプであるすべてのものを受け入れます。すなわち。Cereal と java.lang.Object です。

于 2012-12-13T21:25:13.847 に答える
0
   ArrayList<Flakes> newList = new ArrayList<Flakes>();
   ArrayList<Cereal> moreGeneralList = newList;
   moreGeneralList.add(new NonFlakeCereal());

は何型newList.get(0)ですか?それはそうではありCerealませんFlakes。まだ戻ってくるはずnewListです。getFlakes

于 2012-12-13T21:23:55.640 に答える