いいえ、そうではないです。このことを考慮:
Map<String, List<String>> keyToGroup = new HashMap<String, ArrayList<String>>();
keyToGroup.put("foo", new LinkedList<String>());
2行目は、 aLinkedList<String>
が a - であるため問題ありませんが、 a がanではないため、List<String>
a に追加するという点では論理的に問題ありません。HashMap<String, ArrayList<String>>
LinkedList<String>
ArrayList<String>
明確にするために:
Map<String, ArrayList<String>> map1 = new HashMap<String, ArrayList<String>>();
Map<String, List<String>> map2 = map1; // This is invalid
map2.put("foo", new LinkedList<String>());
ArrayList<String> oops = map1.get("foo"); // Because this would be broken
これは、型引数としてのコレクションの場合だけではありません。通常の継承を使用すると、さらに簡単に確認できます。
List<Banana> bunchOfBananas = new ArrayList<Banana>();
List<Fruit> fruitBowl = bunchOfBananas; // Invalid!
fruitBowl.add(new Apple());
Banana banana = bunchOfBananas.get(0);
すべてのバナナが果物であるため、「バナナのコレクション」はそれらを取得するという意味で「果物のコレクション*」ですが、すべての果物がバナナであるとは限りません.
場合によっては、ワイルドカードのパラメーター化された型を使用できますが、それはまさに何を達成しようとしているかによって異なります。