1. ホーム
  2. java

[解決済み】パラメタライズドクラスの未加工利用

2022-02-03 05:18:12

質問

リフレクションによって指定された型の静的フィールドの値を取得するためのヘルパーメソッドを書きました。 コードは正常に動作していますが、行で"raw use of parameterized class"の警告が表示されます。

final List<Collection> fields = getStaticFieldValues(Container.class, Collection.class);

問題は、型パラメータTが汎用型である可能性があることです。メソッドを書き換える方法はありますか? getStaticFieldValues この問題を回避するために

コード一覧です。

import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;

import java.lang.reflect.*;
import java.util.*;

import org.junit.Test;

public class GenericsTest {

    @Test
    public void test() {
        // Warning "raw use of parameterized class 'Collection'"
        final List<Collection> fields = getStaticFieldValues(Container.class, Collection.class);
        assertEquals(asList("A", "B", "C"), fields.get(0));
    }

    private static <T> List<T> getStaticFieldValues(Class<?> fieldSource, Class<T> fieldType) {
        List<T> values = new ArrayList<>();
        Field[] declaredFields = fieldSource.getDeclaredFields();
        for (Field field : declaredFields) {
            if (Modifier.isStatic(field.getModifiers()) && fieldType.isAssignableFrom(field.getType())) {
                try {
                    final T fieldValue = (T) field.get(null);
                    values.add(fieldValue);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException("Error getting static field values");
                }
            }
        }
        return values;
    }

    public static class Container<T> {
        public static Collection<String> elements = asList("A", "B", "C");
    }
}

解決方法は?

メソッドgetStaticFieldValues()の定義を変更します。

getStaticFieldValues(Class<?> fieldSource, Class<T> fieldType)

になります。

getStaticFieldValues(Class<?> fieldSource, Class<?> fieldType)