2017-02-08 1 views
0

オブジェクトと文字列(オブジェクトのフィールドの名前である文字列)を受け取るメソッドがあります。だから私はオブジェクトクラスからフィールドを取得し、値を取得するfield.get(オブジェクト)を使用します。しかし、私はその値をフィールドが定義されているどのクラスにもキャストしたいと思います。 @suppressWarnings( "unchecked")を使わずにそのキャストを行う方法はありますか?フィールドが文字列名によって参照されるときに汎用オブジェクトのフィールドのクラスを取得する方法

ここに私のコードです。私は1つのオブジェクトだけを使用するように短縮しましたが、元のオブジェクトのリストを使用し、マップキーをオブジェクトのフィールドの値とし、マップ値をオブジェクトとして使用してマップを返します。

public static <T1,T2> T2 getFieldValue(T1 obj, String fieldName){ 
    Field field = null; 
    T2 value = null; 
    try { 
     field = obj.getClass().getField(fieldName); 
    } catch (NoSuchFieldException e) { ... } 
    if (field != null){ 
     try { 
      value = (T2)field.get(obj); // <--- unchecked cast!!! 
     } catch (IllegalAccessException e) { ... } 
    } 
    return value; 
} 

答えて

2

私は、可能な場合T2のクラスに引数を渡すことをお勧めします。 Class<T2>を渡すことにより、castメソッドに電話することができます。キャストが無効な場合、このメソッドはClassCastExceptionをスローします。これにより、チェックされていない警告メッセージも削除されます。

public static <T1, T2> T2 getFieldValue(T1 obj, String fieldName, Class<T2> cls) { 
    Field field = null; 
    T2 value = null; 
    try { 
     field = obj.getClass().getField(fieldName); 
    } catch (NoSuchFieldException e) { 
    } 
    if (field != null) { 
     try { 
      value = cls.cast(field.get(obj)); // <--- no unchecked cast!!! 
     } catch (IllegalAccessException e) { 
     } catch (ClassCastException e) { 
     } 
    } 
    return value; 
} 
+0

+1は、Class.cast()を使用していますが、空のキャッチブロックは-1です。 'ReflectiveOperationException'のようなものを捕まえ、' IllegalArgumentException'や何かに包まれていてもそれを再利用していても、もっと便利なことをするのは良いでしょう。 –

+0

例外は何らかの方法で処理する必要があります。しかし、私は元の例も空のままにしていたので、それらを空にしました。唯一の違いは、コードがコンパイルされるように「...」を削除したことです。 – DragonAssassin

+0

'value = cls.cast(field.get(obj));'は安全ではありません。警告はちょうど遠ざけられ、鎮圧されます。それは安全でないコードの印象を与えます。私はメソッドの安全でない部分を伝える明示的な '@ suppressWarnings'を持つ明示的なキャストを好む。 – davidxxx

関連する問題