オブジェクトを受け入れるメソッドがあります。 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();
}
}
できません。タイプの消去により、リフレクションはHashMapのインスタンスがあることを示しますが、タイプは実行時に削除されます。事実上、HashMap <Object、Object>があります。
そうは言っても、まだいくつかの選択肢があり、私があなたがとるべきいくつかのアドバイスがあります。その中で:
簡単に言うと、これをマップと同じように扱い、キャストなしでも文字列としてキーにアクセスし、nullチェックを実行して.toString()を呼び出すことにより、各値を文字列として利用しようとすると、はるかに安全になります。実装。
元のルーチンはコーディングとまったく同じであることに注意してください
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)でない場合にのみエラーをスローします。
(「完全に同等」とは、同じバイトコードが生成されることを意味します。)
addHelper(Object)
メソッドを呼び出すtry-catchを使用する必要があります。これにより、HashMap
の正しいタイプが保証されます。
try{
addHelper(hashMap);
}
catch(ClassCastException ex){
System.out.println("Is not desired hashmap");
}
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");
}
これで、オブジェクトが正しいタイプであることがわかりました-カスタムの抽象クラスなどです。