3

これをどのように書き換えますか:

<T> T callMethod(String methodName, Object[] parameters) throws ... {
    ...
    return (T) SomeClass.class.getDeclaredMethod(methodName, parameterTypes).invoke(binding, parameters);
}

したがって、警告は生成されません

warning: [unchecked] unchecked cast
        return (T) SomeClass.class.getDeclaredMethod(methodName, parameterTypes).invoke(binding, parameters);
required: T
found:    Object
where T is a type-variable:
T extends Object declared in method <T>callMethod(String,Object[])

つまり、SupressWarnings のないソリューションです。

4

5 に答える 5

5

メソッドは。を返す@SuppressWarnings(...)ので、このアプローチに従わなければならないと思います。ジェネリックは実行時に消去され、リフレクションは実行時に発生することを忘れないでください...invoke()Object

乾杯、

于 2013-01-02T10:40:41.703 に答える
3

コンパイル時に、実行時に選択したメソッドの戻り型がTであるとコンパイラーが判断する方法はありません。コンパイル時にのみ警告を抑制できます。

于 2013-01-02T10:40:28.397 に答える
3

ピーター・ローリーが指摘したように

実行時に選択したメソッドの戻り値の型がT.

さらに一歩進んで、これcallMethodはジェネリック メソッドであってはなりません。呼び出し元はその名前を文字列として渡すことによってどのメソッドが呼び出されるかを決定するため、メソッドは単に戻り、呼び出しサイトに強制Objectinvokeにキャストする必要があります。

使用しないでください@SuppressWarnings- ここでそれを正当化する方法はありません。

于 2013-01-02T11:01:22.830 に答える
2

これを行うには、メソッド パラメーターで結果の型を宣言する必要があります。

public <T> T callMethod(Class<T> resultType, String methodName, Object[] parameters) {

Object result = SomeClass.class.getDeclaredMethod(methodName, parameterTypes).invoke(binding, parameters);

if(resultType.isInstance(result)) {
  return resultType.cast(result);
}

throw new ClassCastException("Invalid result type");

}

なぜしなければならないのですか?

Peter L.の回答を参照してください。

于 2013-01-02T10:45:37.140 に答える
0

@SuppressWarnings("unchecked")アノテーションを使用していません。

@SuppressWarnings("unchecked")オブジェクトの宣言にのみ適用できます。これは機能します。

于 2013-01-02T10:39:07.323 に答える