2014-07-10 37 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) 
相關問題