3

次のコードは、Reflection API を使用してフィールドの値を取得します。提供された画像でわかるように、これにより未チェックのキャスト警告が生成されます。@SuppressWarnings("unchecked")を使用して警告を抑制することができます。これに代わるものがあるかどうか疑問に思っていましたか?

更新: KeyType はジェネリックです。だからKeyType.class.cast(object); 型消去のために機能しません。

private K getId(Field idField, V o) {
    K id = null;
    try {
        idField.setAccessible(true);
        id = (K) idField.get(o);
    } catch (IllegalAccessException ignored) {
        /* This never occurs since we have set the field accessible */
    }
    return id;
}

未チェックのキャスト警告


解決策: SuppressWarnings注釈がここに行く方法のようです.. お時間をいただきありがとうございます。

解決

4

2 に答える 2

2

Class メソッドのキャストは、ClassCastException をスローする可能性がありますが、@SupressWarnigns を必要としません。

KeyType keyType = KeyType.class.cast( idField.get(o) );

その場所では一般的なパラメーターを知っている必要があるため、次のように続行できます。

private static class ListInteger extends ArrayList<Integer>{}

Object obj = new ArrayList<Integer>();
ListInteger test = ListInteger.class.cast(obj);

クラス KeyType のオブジェクトを取得したら、もちろん、次のことができます。

KeyType keyTypeX = ...; // not null

KeyType keyType = keyTypeX.getClass().cast( obj );

@SuppressWarnings はそれほど悪くはありませんが、別の方法があります。宣言 + 代入に制限するようにしてください。メソッドには入れないでください。

于 2015-11-02T15:49:28.990 に答える
1

getFieldのメソッドのシグネチャは

public Object get(Object obj) { 
 ...
}

ジェネリックではないため、戻り値の型は Object であるため、コンパイル時にエラーを強制することはできません。

値のタイプが常に正しいことが確実な場合はValueType、メソッドにドキュメントを追加し、タイプが常に ValueType であり、@SuppressWarnings("unchecked") を使用することを伝えます。

于 2015-11-02T15:55:10.450 に答える