7

(キー: 文字列、値: ArrayList) を使用して HashMap にデータを格納しています。私が問題を抱えている部分は、新しい ArrayList "current" を宣言し、HashMap で文字列 "dictCode" を検索し、見つかった場合は current を戻り値 ArrayList として設定します。

ArrayList current = new ArrayList();      
if(dictMap.containsKey(dictCode)) {
    current = dictMap.get(dictCode);   
}

「current =...」行は、次のコンパイラ エラーを返します。

Error: incompatible types
found   : java.lang.Object
required: java.util.ArrayList

私はこれを理解していません... HashMap は、値として格納した ArrayList の代わりにオブジェクトを返しますか? このオブジェクトを ArrayList に変換するにはどうすればよいですか?

ありがとうございました。

4

5 に答える 5

40

そのスコープで HashMap 宣言はどのように表現されますか? そのはず:

HashMap<String, ArrayList> dictMap

そうでない場合は、オブジェクトと見なされます。

たとえば、コードが次の場合:

HashMap dictMap = new HashMap<String, ArrayList>();
...
ArrayList current = dictMap.get(dictCode);

それはうまくいきません。代わりに、次のようにします。

HashMap<String, ArrayList> dictMap = new HashMap<String, Arraylist>();
...
ArrayList current = dictMap.get(dictCode);

ジェネリックが機能する方法は、型情報がコンパイラで利用可能ですが、実行時には利用できないということです。これを型消去と呼びます。HashMap (またはその他のジェネリック実装) の実装は、オブジェクトを処理しています。型情報は、コンパイル時の型の安全性チェックのために存在します。ジェネリックのドキュメントを参照してください。

またArrayList、 もジェネリック クラスとして実装されているため、そこで型を指定することもできます。ArrayListyour に class が含まれていると仮定すると、MyClass上記の行は次のようになります。

HashMap<String, ArrayList<MyClass>> dictMap
于 2009-06-06T23:42:15.603 に答える
11
public static void main(String arg[])
{
    HashMap<String, ArrayList<String>> hashmap = 
        new HashMap<String, ArrayList<String>>();
    ArrayList<String> arraylist = new ArrayList<String>();
    arraylist.add("Hello");
    arraylist.add("World.");
    hashmap.put("my key", arraylist);
    arraylist = hashmap.get("not inserted");
    System.out.println(arraylist);
    arraylist = hashmap.get("my key");
    System.out.println(arraylist);
}

null
[Hello, World.]

正常に動作します...私のコードで間違いを見つけたかもしれません。

于 2009-06-06T23:52:39.217 に答える
2

あなたの dictMap は typeHashMapであると思います。これにより、デフォルトは になりますHashMap<Object, Object>。より具体的にしたい場合は、 として宣言するHashMap<String, ArrayList>か、HashMap<String, ArrayList<T>>

于 2009-06-06T23:43:05.880 に答える
2

ここでは、(上記の回答のように)ジェネリックを使用するのが最善の策です。私は再確認しました:

test.put("test", arraylistone); 
ArrayList current = new ArrayList();
current = (ArrayList) test.get("test");

ジェネリックは、取得時に処理を行うのではなく、正しいデータのみが追加されるようにするため、お勧めしません。

于 2009-06-06T23:49:16.180 に答える
2

getメソッドHashMapは を返してObjectいますが、変数currentArrayList:

ArrayList current = new ArrayList();
// ...
current = dictMap.get(dictCode);

上記のコードが機能するには、Objectを にキャストする必要がありますArrayList

ArrayList current = new ArrayList();
// ...
current = (ArrayList)dictMap.get(dictCode);

ただし、最初にジェネリック コレクション オブジェクトを使用することをお勧めします。

HashMap<String, ArrayList<Object>> dictMap =
    new HashMap<String, ArrayList<Object>>();

// Populate the HashMap.

ArrayList<Object> current = new ArrayList<Object>();      
if(dictMap.containsKey(dictCode)) {
    current = dictMap.get(dictCode);   
}

上記のコードは、ArrayListに のリストがあることを前提としており、Object必要に応じて変更する必要があります。

ジェネリックの詳細については、Java チュートリアルにジェネリックに関するレッスンがあります。

于 2009-06-06T23:50:36.053 に答える