2012-01-08 1 views
4

私はクラスFourByFourBoardGameBoardに拡張されています。私は、次のフィールドを定義しますジェネリックでJavaのコレクションに適用できない引数を渡すエラー

mGameTypeToKeysMap.put(Game.FOUR_BY_FOUR, mFourByFourBoardKeys); 

しかし、私はこの取得::私のコンストラクタで

private Map<Integer,List<Key<? extends GameBoard>>> mGameTypeToKeysMap = new Hashtable<Integer,List<Key<? extends GameBoard>>>(); 

private List<Key<FourByFourBoard>> mFourByFourBoardKeys = new ArrayList<Key<FourByFourBoard>>(); 

を、私は呼び出そう

タイプのメソッドput(Integer, List<Key<? extends GameBoard>>) Map<Integer,List<Key<? extends GameBoard>>>ではありませんが 引数に該当します(int, List<Key<FourByFourBoard>>)

私は何をしようとしているのか、別のアプローチを使用することができますが、コードを少し見てから、なぜこれが機能しないのか分かりません。

私がしようとした場合::

Key<GameBoard> a = mFourByFourBoardKeys.get(0); 

私が手:

型の不一致を:から変換できません。この問題は、私が思ったよりも簡単かもしれません

EDIT

Key<FourByFourBoard>Key<GameBoard>

にもかかわらず:

GameBoard someBoard = new FourByFourBoard(); 

は合法です。これはまだジェネリックの質問ですが、コレクションの部分は重要ではありませんでした。私の頭はまだ少し回転しています。最初のリストにあなただけAインスタンスを追加することができ、第二に、あなたが両方ABインスタンスを追加することができますので、

+0

KeyはObjectifyのクラスです。 http://objectify-appengine.googlecode.com/svn/trunk/javadoc/com/googlecode/objectify/Key.html –

答えて

3
List<A extends B>

List<B>は、同じではありません。

これは、すべて完璧に、より具体的にページ4(セクションジェネリックおよびサブタイピング)

編集

小さな例にこれを示すとより密接コード

のビットの一致に、 Java generics tutorialに説明され
Map<Integer, List<List<? extends Number>>> a = new Hashtable<Integer,List<List<? extends Number>>>(); 
List<List<Double>> b = new ArrayList<List<Double>>(); 
a.put(0, b);//won't compile 
List<List<? extends Number>> c = new ArrayList<List<? extends Number>>(); 
a.put(1, c);//works perfectly 

これではないコンパイルがどの私がリンクしているPDFで説明されており、関連部分を引用する理由

ジェネリックの理解をテストしましょう。次のコードスニペットは合法ですか?

List<String> ls = new ArrayList<String>(); //1 
List<Object> lo = ls; //2 

1行目は確かに合法です。問題のトリッキーな部分は2行目です。これは、 という質問に繋がります。これは、文字列のリストであり、オブジェクトのリストです。ほとんどの人の本能は答えます: "確か!"。 さて、次の数行を見てみましょう:私は、全体のPDFを通過し、その文書中の(他の)の例を見てみることをお勧めし

lo.add(new Object()); // 3 
String s = ls.get(0); // 4: attempts to assign an Object to a String 

+0

私はこれを行うことができます:private Map > a =新しいハッシュテーブル>();を拡張します。プライベートList b =新しいArrayList (); a.put(0、b); - 問題は、ジェネリックがキーにあると思われる。 –

+0

@BenFlynn私は私の答えを編集しました – Robin

+0

もっと詳しく説明し、関連情報を引用してくれてありがとう。 –

1

一般的なタイプは、と正確に一致する必要があります。です。これを試してください:あなたはまだリストOKにFourByFourBoardインスタンスを追加することができますが、マップは現在、リストを受け入れます

private List<Key<? extends GameBoard>> mFourByFourBoardKeys = new ArrayList<Key<? extends GameBoard>>(); 

注:

Map<Integer, List<Comparable<? extends Number>>> map = new HashMap<Integer, List<Comparable<? extends Number>>>(); 
List<Comparable<? extends Number>> list = new ArrayList<Comparable<? extends Number>>(); 
list.add(new Long(0)); 
map.put(new Integer(1), list); 
1

?手段「私は知らない、いくつかの明確なタイプを」;:私はこの誰もが自分自身のためにこのコードをコピー&ペーストすることができますので、同様のパターンで、標準のJDKクラスを使用してテストしました? extends Fooは、「わかりませんが、Fooを拡張している特定のタイプ」を意味します。

FourByFourBoardGameBoardを拡張確定タイプであるが、コンパイラはmGameTypeToKeysMapの定義で述べたものと同じそのような明確なタイプであることを知ることができません。説明するために

、私はそれを書くことが許されると思う:あなたが試みputは非常に間違っているだろう指し

mGameTypeToKeysMap = new Hashtable<Integer,List<Key<EightByEightBoard>>>(); 

れます。

+0

ありがとうございました! –

関連する問題