web-dev-qa-db-ja.com

HashMapのオブジェクトインスタンスの場合、キーと値のタイプを確認するにはどうすればよいですか?

オブジェクトを受け入れるメソッドがあります。 1つの使用例では、メソッドはHashMap<String, String>を受け入れ、各値を対応するキー名のプロパティに設定します。

public void addHelper(Object object) {
    if (object instanceof HashMap) {
        HashMap<String, String> hashMap = (HashMap<String, String>) object;
        this.foo = hashMap.get("foo");
        this.bar = hashMap.get("bar");
    }
}

このクラスは特定のインターフェイスに準拠しているため、これらのプロパティのセッターを追加することはできません。

私の質問は、ここで型キャストを確認するにはどうすればよいですか?

HashMap<String, String> hashMap = (HashMap<String, String>) object;

前もって感謝します!

[〜#〜]ソリューション[〜#〜]

@drobertからの回答のおかげで、ここに私の更新されたコードがあります:

public void addHelper(Object object) {
    if (object instanceof Map) {
        Map map = (Map) object;
        if (map.containsKey("foo")) this.foo = map.get("foo").toString();
        if (map.containsKey("bar")) this.bar = map.get("bar").toString();
    }
}
15
Shaun Scovil

できません。タイプの消去により、リフレクションはHashMapのインスタンスがあることを示しますが、タイプは実行時に削除されます。事実上、HashMap <Object、Object>があります。

そうは言っても、まだいくつかの選択肢があり、私があなたがとるべきいくつかのアドバイスがあります。その中で:

  • 「HashMap」ではなく「Map」のインスタンスであるかどうかを確認してください。ほとんどの場合、特定の操作ではなく、キーによる迅速なアクセスのみに注意するため、APIがはるかに柔軟になります。
  • 「containsKey(Object)」と「get(Object)」を定義するJava.util.MapのAPIを利用して、キャストしなくてもmapInst.get( "stringKey")を安全に使用できるようにします。
  • すべての値が文字列であることを確認することはできませんが、Java.lang.ObjectのtoString()メソッドを利用して、各値に関係なくStringを取得できます。

簡単に言うと、これをマップと同じように扱い、キャストなしでも文字列としてキーにアクセスし、nullチェックを実行して.toString()を呼び出すことにより、各値を文字列として利用しようとすると、はるかに安全になります。実装。

20
drobert

元のルーチンはコーディングとまったく同じであることに注意してください

public void addHelper(Object object) {
    if (object instanceof HashMap) {
        HashMap hashMap = (HashMap) object;
        this.foo = (String)(hashMap.get("foo"));
        this.bar = (String)(hashMap.get("bar"));
    }
}

明示的な(HashMap)キャストはinstanceofによって保護されているため、エラーをスローする可能性はありません。暗黙的に提供される(String)キャストは、HashMapから返された値が文字列(またはnull)でない場合にのみエラーをスローします。

(「完全に同等」とは、同じバイトコードが生成されることを意味します。)

4
Hot Licks

addHelper(Object)メソッドを呼び出すtry-catchを使用する必要があります。これにより、HashMapの正しいタイプが保証されます。

      try{
        addHelper(hashMap);
        }
        catch(ClassCastException ex){
            System.out.println("Is not desired hashmap");
        }
2
Masudul
   try{
    HashMap<String, String> hashMap = (HashMap<String, String>) object;
    this.foo = hashMap.get("foo");
    this.bar = hashMap.get("bar");
    }catch(ClassCastException e){
        System.err.log("Object is not a hashmap");
    }

これで、オブジェクトが正しいタイプであることがわかりました-カスタムの抽象クラスなどです。

0
false_memories