2012-03-26 11 views
1

以前に解析されたJSONオブジェクトから正しいタイプとしてデータを抽出するメソッドが必要です。 JSONObject(生データ)は、地図を拡張し、それは次のようになります。Javaの汎用メソッドで型を判別するにはどうすればいいですか?

private <Type> Type getValue(String key, Type def) 
{ 
    if (!rawdata.containsKey(key)) return def; 
    if (!(rawdata.get(key) instanceof Type)) return def; 
    return (Type) rawdata.get(key); 
} 

instanceofは明らかにコンパイル時エラーを生成します。パラメータdefがデフォルト値で、キーが使用できないか、タイプが間違っている場合に返されます。しかしdefもnullになることがありますので、def.getClass()は機能しません。

正しいタイプのマップエントリの内容をどのように確認できますか?

+0

可能重複[ジェネリック型のクラスを決定するには?](http://stackoverflow.com/questions/182636/how-to-determine-the-class-of-a-generic-タイプ) – Nicolas

+0

私はあなたが誤って - メソッドシグネチャの余分な 'タイプ'と思う。 – questzen

+0

@questzenいいえ、それは一般的な宣言ですが、標準の規約を使用すると読みやすくなりました。 'private T getValue(String key、T def)' – assylias

答えて

7

デフォルトの値がnullの場合を処理する唯一の方法は、タイプがClassの追加のパラメータを必要とする方法です。これは、デフォルト値をサブクラスにすることができるためです必要なタイプの

1

デフォルト値が指定されていない場合は、戻り値の型としてClassオブジェクトを受け入れることをお勧めします。

private <T> T getValue(String key, Type defaultValue); 

private <T> T getValue(String key, Class<T> type); 
2

あなただけ(これは望ましくない行動が、あなたはまた、所望のクラスに渡す必要があります場合はnullが、いずれのタイプとしてカウントされます)ヌルかどうかを確認する必要があります:あなただけのような関数をオーバーロードすることができます。

private <T> T getValue(String key, T def) 
{ 
    if (!rawdata.containsKey(key)) return def; 

    Object value = rawdata.get(key); 

    if (def == null) return (T) value; 
    // note that the above is inherently unsafe as we cannot 
    // guarantee that value is of type T 

    // this if statement is the same as "value instanceOf Type" 
    // is type safe, but not null safe 
    if (def.getClass().isAssignableFrom(value.getClass())) { 
     return (T) value; 
    } else { 
     return def; 
    } 
} 

より安全なメソッドのシグネチャは次のようになります。私たちは安全の種類を確認することができます

private <T> T getValue(String key, T defaultValue, Class<T> defaultClass) 

この方法では、デフォルトがnullの場合にもマッチします。

0

また、Joshua Blochの "Effective Java Second Edition"のTypesafe Heterogeneous Container(THC)パターンを使用することもできます。

基本的に、挿入するときにアイテムのクラスをマップに保存します。検索すると、タイプが同じであることがわかります。

Map<Class, Map<String, Object>> rawData = ... 
関連する問題