2016-04-08 18 views
2

私は混乱していたコードの例を示します。マップで互換性のない型エラーが発生しました

制限付きの型のコレクションを作成し、同じ変数を他の無限型のコレクションである別の変数に割り当てると、コードが機能します。

List<? extends Number> numberList = new ArrayList<>(); 
List<?> anotherList = numberList; // OK 

私は地図内で同じことをしようとした場合、私は、「互換性のない型」のエラーが表示されます。

Map<String, List<? extends Number>> numberMap = new HashMap<>(); 
Map<String, List<?>> anotherMap = numberMap; // ERROR 

エラーは言う:

Map<String,List<? extends Number>> cannot be converted to Map<String,List<?>> 

Map<String,List<? extends Number>>Map<String,List<?>>のタイプではないですか?

は、ここで私はこれが動作しない理由を理解しようとしている便利https://ideone.com/AZgV9H

のためのクラス全体だとどのように私はそれを動作させるために、それを変更する必要があります。

+3

ジェネリックは**共変ではありません。 'List 'は 'List 'ではないので、 'Map >'は 'Map 'ではありません。 –

+0

[リストはリストのサブクラスですか?なぜJavaのジェネリックは暗黙的に多相でないのですか?](http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p) – Pshemo

答えて

2

だけList<? extends Number>List<?>のサブタイプであるため、ことMap<String, List<? extends Number>>List<Number>List<?>のサブタイプではないのと同じ理由でMap<String, List<?>>のサブタイプであることを意味するものではありません - Javaのジェネリックは不変です。

List<Number>をサブタイプList<?>にするには、バインドされたワイルドカードを追加する必要があります。解決策はここで同じです - ? extendsList<?>に追加してください。

Map<String, ? extends List<?>> anotherMap = numberMap; 
関連する問題