5

内部にリストを含むマップを使用する必要があります:

Map<String, List<String>> keyToGroup = new HashMap<String, ArrayList<String>>();

Eclipse のこの行でコンパイラ エラーが発生します。

唯一の機能は、Map の内部 List を ArrayList に変更しているようです

Map<String, ArrayList<String>> keyToGroup = new HashMap<String, ArrayList<String>>();

多くのインターフェイスのメソッドの署名を変更する必要がありましたが、まだ取得できません。最初の定義が機能しないのはなぜですか?

それは同じではありませんか、すべきではありません

Map<String, List<String>> keyToGroup 

&

Map<String, ArrayList<String>>

同じですか?

4

3 に答える 3

8

いいえ、そうではないです。このことを考慮:

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);

すべてのバナナが果物であるため、「バナナのコレクション」はそれらを取得するという意味で「果物のコレクション*」ですが、すべての果物がバナナであるとは限りません.

場合によっては、ワイルドカードのパラメーター化された型を使用できますが、それはまさに何を達成しようとしているかによって異なります。

于 2013-09-19T06:33:09.440 に答える
0

いいえそうではありません。ジェネリックはJava では共変ではありません。

それらが共変である場合、ジェネリックを持つ目的を無効にするList代わりに、任意のタイプを論理的に配置できます。ArrayList

ジェネリックについて非常によく説明されている「Effective Java (2nd Edition) Chapter 5: Generics」を読むことを検討してください。

別の良い読み物はhttp://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.htmlです

于 2013-09-19T06:37:46.123 に答える
0

マップまたはリストで特定のリストの実装が必要かどうかを自問してください。特定の実装の場合、最後の例を使用できます。

Map<String, ArrayList<String>> keyToGroup = new HashMap<String, ArrayList<String>>();

リストの場合は、次を使用します。

Map<String, List<String>> keyToGroup = new HashMap<String, List<String>>();
keyToGroup.put("arraylist", new ArrayList<String());
keyToGroup.put("linkedlist", new LinkedList<String());

ところで、通常は 2 番目のオプションが設計の観点から優れているため、現時点で正確にわからない場合は、最初に 2 番目のオプションを使用してみてください。

于 2013-09-19T06:41:17.473 に答える