6

List<CherryCoke>「タイプの不一致:からに変換できません」というメッセージが表示さList<Coke<?>>れます

「チェリーコークスのリスト」は「コークスのリスト」ではないようです。これは直感に反します。とにかくその'xs'を作成するにはどうすればよいですか?それList<Coke<?>>がaである必要があり、サブクラスが必要な場合はどうすればよいCoke<Cherry>ですか?

class Taste { }
class Cherry extends Taste { }

abstract class Coke<T extends Taste> { }    

class CherryCoke extends Coke<Cherry> { }

class x {
  void drink() {
    List<Coke<?>> xs = Arrays.asList(new CherryCoke());
  }
}
4

3 に答える 3

9

そうです-「コークスのリスト」は「チェリーコークスのリスト」ではありません-「コークスを拡張するもの」のリストは「チェリーコークスのリスト」です。

あなたはおそらく次のように定義xsしたいでしょうList <? extends Coke<?>> xs = Arrays.asList(new CherryCoke());

于 2012-11-15T00:14:21.820 に答える
5

他の人が指摘しているように、同じことではList<CherryCoke>ありList<Coke<?>>ません。

しかし、それはここでは実際には問題ではありません。xsとして入力する必要はありませんList<? extends Coke<?>>。新しいものを作成してからList<Coke<?>>、それに新しいものを追加することもできCherryCokeます。

このエラーは、コンパイラがasListの型パラメータをT誤って推測していることに関係しています。自分で指定するTと、コンパイルされます。

List<Coke<?>> xs = Arrays.<Coke<?>>asList(new CherryCoke());
于 2012-11-15T00:44:03.130 に答える
4
List<Coke<?>> xs = Arrays.asList(new CherryCoke());

List<CherryCoke>List<Coke<?>>(何かのコーラのリスト)のサブタイプではありません。

ジェネリック型の上限を定義する必要があります。

List<? extends Coke<?>> xs = Arrays.asList(new CherryCoke());
于 2012-11-15T00:18:42.917 に答える