2017-02-07 11 views
0

Javaのジェネリックスがどのように機能するのか分かりません。私は以下のコードに簡略化され似たような状況があります。Javaジェネリックパラメータの親クラスを使用

public static void main(String[] args) { 
    Map<String, Collection<B>> map1 = test(); 
    Map<String, List<B>> map2 = test(); 
    Map<String, ArrayList<B>> map3 = test(); 
} 

private static Map<String, ArrayList<B>> test() { 
    return null; 
} 

私は互換性のないタイプを言うエラーが出るMAP1またはMAP2を作成する - それはArrayListのを期待していたが、代わりにコレクション/リストを得ました。

このような問題を解決するにはどうすればよいですか?ここで

+2

この問題に関する以前の質問が表示されることがあります。[なぜできないのですか]リスト mylist = ArrayList ();](https://stackoverflow.com/questions/5763750/why-we-cant- do-listparent-mylist-arraylistchild)である。 [スーパータイプのリストをサブタイプのリストにどのようにキャストしますか?](https://stackoverflow.com/questions/933447/how-do-you-cast-a-list-of-supertypes-to-a-listサブタイプの) –

答えて

2

は正常にコンパイルするコードです:

public static <B> void main(String[] args) { 
    Map<String, ? extends Collection<B>> map1 = test(); 
    Map<String, ? extends List<B>> map2 = test(); 
    Map<String, ArrayList<B>> map3 = test(); 
} 

private static <B> Map<String, ArrayList<B>> test() { 
    return null; 
} 

あなたが? extends Collection<B>? extends List<B>を追加する必要があり? extends Collectionを書くことMapvalueを形成ObjectCollectionクラスのsub typeであり、したがってtest()ことを意味するので、 valueArrayListタイプであり、実際にはsub typeCollection

012の Mapを返すので、呼び出されます

はまた、あなたはそれが役に立てば幸いmaintest()

の署名に<B>を追加する必要があることに注意してください!

関連する問題