2014-07-10 32 views
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"); 
    } 
} 

回答

1
在方法getStaticFieldValues的定义

()的变化:

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

getStaticFieldValues(Class<?> fieldSource, Class<?> fieldType) 
相关问题