1
我寫了一個幫助方法,通過反射獲取指定類型的靜態字段的值。 代碼工作正常,但我正在逐漸「生用參數化類的」預警線:原始使用參數化類
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");
}
}