2016-04-26 12 views
0

私はMap<Object,Object>を持っています。これは、Stringをキーに、Doubleを値として含みます。
double値を抽出するには、((Number)en.getValue()).doubleValue()を実行します。
しかし、明白な理由から、値が本当にDoubleであるかどうかを確認する防御プログラミングを行いたいと思います。
どうすれば達成できますか?Object as Double

instanceOfは解決策ではありません。この場合、本来の倍精度を認識していないようです。

+6

ちょうどそれが – mariusz2108

+0

を使用互換性がありません。 – IUnknown

+4

「_defensiveのprogramming_」に渡され、 'Object'を使用してジェネリックがそうであるようにオプションではありません地図<文字列、ダブル> –

答えて

1

は単純に実行します。

Object o = en.getValue(); 
if (o instanceof Number) { 
    // do something with ((Number)o).doubleValue(); 
} else { 
    // not a double 
} 

これがために働く:

  • map.put( "ABC"、新しいダブル(12));
  • map.put( "def"、15); //整数にボックス化された数値
  • map.put( "ghi"、15.0d); // Doubleにボックス化された数値でもある

Doubleだけが確実に処理されるようにするには、instanceofのチェックをNumberではなくDoubleに変更します。

あなたがまだinstanceofが答えではないと感じたら、理由を説明できますか?

+0

私は彼が実際にオブジェクトに手を出していると思います。もしそうなら 'instanceof'は大いに助けにならないでしょう – Priyamal

+0

どうしてそうですか? instanceofはどのオブジェクトでも動作し、サブジェクトが指定された型またはその型のサブクラスまたはインスタンスであればtrueを返します。 –

-1

Davidと同様に、Numberよりも具体的なDoubleをチェックすることができます。

Javaコレクションはプリミティブ型のみをサポートしていません。

このような何かを助けることができる
Map<Object, Object> map = new HashMap<>(); 
map.put("one", new Integer(1)); 
map.put("two", new Double(2)); 
map.put("three", "3"); 
map.put("four", new Object()); 

// Find Double 
for (Object key : map.keySet()) { 
    Object value = map.get(key); 

    if (value instanceof Double) { 
     System.out.println(key + ": " + value + " (Double)"); 
    } 
} 
0

Class<? extends Object> className = obj.getClass(); 

if (className.getName().contains("Number")){ 
//check to see if Double 
//add the object to the Map  
}else { 
    //convert it to whatever and do error handling 
} 
関連する問題