【问题标题】:Raw use of parameterized class参数化类的原始使用
【发布时间】:2014-07-10 09:18:47
【问题描述】:

我编写了一个辅助方法,用于通过反射获取指定类型的静态字段的值。 代码运行良好,但我在线收到“参数化类的原始使用”警告:

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");
    }
}

【问题讨论】:

  • 要么使用通配符,要么使用@SuppressWarnings("rawtypes")抑制警告

标签: java generics


【解决方案1】:

在getStaticFieldValues()方法的定义中改变:

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

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

【讨论】:

  • 让我减轻你寻找差异的压力。区别是“?”在第二个参数“Class>”
猜你喜欢
  • 2021-10-20
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
相关资源
最近更新 更多