3

リフレクションによるメソッドの呼び出しに基づいてオブジェクトのリストをハッシュするジェネリックメソッドを作成しようとしています。発呼者は、ハッシュ用のキーを生成するメソッドを指定できるという考え方です。私の問題は、@ SuppressWarnings( "unchecked")アノテーションを避けたいということです。したがって、本質的には、method.invokeを取得して、ObjectではなくタイプT2のオブジェクトを返す方法を見つけたいと思います。助けてくれてありがとう。

public static <T1, T2> HashMap<T2, T1> hashFromList(
        List<T1> items_to_be_hashed,
        String method_name_to_use_to_generate_key) {
    HashMap<T2, T1> new_hashmap = new HashMap<>(items_to_be_hashed.size() + 5, 1);
    for (T1 object_to_be_hashed : items_to_be_hashed) {
        try {
            //Call the declared method for the key
            Method method = object_to_be_hashed.getClass().getDeclaredMethod(method_name_to_use_to_generate_key);
            @SuppressWarnings("unchecked")
            T2 key = (T2) method.invoke(object_to_be_hashed);
            new_hashmap.put(key, object_to_be_hashed);
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException exception) {
            exception.printStackTrace();
        }
    }
    return new_hashmap;
}
4

2 に答える 2

8

警告の抑制を回避し、真のキャスト (問題をキャッチする) を持つ唯一の方法はT2、実行時に知ることです。これは、追加のパラメーターを介して行うことができます。

... hashFromList(List<T1> itemsToHash,
                 String generationMethod,
                 Class<T2> clazzT2)

その後、次を使用できますClass.cast

T2 key = clazzT2.cast(method.invoke(objectToHash));
于 2013-02-22T11:45:48.937 に答える
1

キーを返すインターフェイスを導入する

// T1 = key, T2 = object type
public interface KeyGenerator<T1, T2> {
  T1 generateKey(T2 object);
}

そして、キージェネレーターにそのインターフェイスを実装させてから、ヘッダーを次のように変更できます

public static <T1, T2> HashMap<T2, T1> hashFromList(
        List<T1> items_to_be_hashed,
        KeyGenerator<T2, T1> keyGenerator) {

そして、コードを次のように変更します

        T2 key = keyGenerator.generateKey(object_to_be_hashed);

これは、オブジェクトに静的な型付けを行う必要があるため、NoSuchMethod 例外を削除できることも意味します (ただし、明らかに NPE を取得できます)。

うまくいけば、これが助けになります。また、通常、リフレクションをコードに入れるのが常に良いとは限らないことに注意してください。賢く使ってください:)

于 2013-02-22T11:45:53.313 に答える