0

私はJavaとAndroidを初めて使用します。次の行を理解したい:

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

私の疑問は、listMapというタイプのListMapというオブジェクトとして宣言されているということです。ただし、ArrayListとしてインスタンス化されます。簡単な質問で申し訳ありませんが、なぜこれが可能ですか?

ps1:Listがインターフェースであることを知っているので、インターフェースタイプのオブジェクトをインスタンス化できません。

ps2:listMapをArrayListタイプとして宣言できます。それをリストとして宣言することの利点は何ですか。

4

3 に答える 3

2

ps1:Listがインターフェイスであることを知っているので、そのタイプのオブジェクトをインスタンス化できません。

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

あなたは正しいListです、インターフェースなので、インターフェースをインスタンス化することはできません。インスタンス化するには、インターフェイスの実装クラスを使用する必要があります。ArrayListインターフェイスの実装クラスでありList、ableステートメントで使用されます。

ps2:listMapをArrayList型として宣言できます。それをリストとして宣言することの利点は何ですか。

いつでもArrayList左側で使用できます。

  ArrayList<Map<String, String>> listMap = new ArrayList<Map<String, String>>();

インターフェイスを使用する利点: クラス全体で変数オブジェクト(listMap)を使用する場合は、インターフェイスを型として使用する方が適切ですが、変数オブジェクト(lsitMap)をプログラム内でローカルに使用する場合は、存在しないと思います。追加の利点。

Mapここで、これもインターフェイスであるについて考えます。Map上記のステートメントでオブジェクトをインスタンス化していないことに注意してください。あなたはあなたのlistMapリストがMapタイプの要素を含むであろうと言っているだけです。

繰り返しますが、要素をインスタンス化してに追加しようとすると、次のようなインターフェイスlistMapの実装クラスが必要になります。MapHashMap

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

   Map<String, String> lsitMapElement1 = new HashMap<String, String>();
   lsitMapElement1.put("key1", "value1");
   listMap.add(lsitMapElement1 );

   Map<String, String> lsitMapElement2 = new HashMap<String, String>();
   lsitMapElement2.put("key2", "value2");
   listMap.add(lsitMapElement2);

これが物事を明確にすることを願っています。

于 2012-11-05T03:46:48.273 に答える
2

ArrayListのサブタイプですList。それはですArrayList-a List

また、サブタイプのインスタンスをそのスーパータイプの変数に割り当てることができます。または、スーパータイプsomeが予想される場合は、それをsomesubstypeに置き換えることができます。


これでオブジェクトポリモーフィズム(継承あり)を実現し、コードは特定の実装に依存しません。むしろ将来いつでも、それArrayListが機能しないことに突然気づき、他の実装が必要にListなった場合、残りのコードに影響を与えることなく、その実装に簡単に切り替えることができます。

これが、彼らが「可能な限り常にインターフェースに対してコーディングする」と言う理由です。

于 2012-11-05T03:49:59.723 に答える
1

このArrayListクラスはListインターフェースを実装します。つまり、によって定義されたすべてのメソッドListが実装されています。ArrayList他のコードは、これが具体的にすべてのListメソッドを実装していることを知る必要はありません。

于 2012-11-05T03:48:33.977 に答える