钻石操作员;初始化paremeterized通用类

时间:2014-02-05 11:33:20

标签: java generics collections initialization

通常需要快速收集值才能迭代它。而不是手动创建实例,添加项目或执行众所周知的构造函数初始化,从数组(Set<String> mySet = new HashSet<String>(Arrays.AsList("a", "b", "c")))创建列表集合我想创建一个应该为我完成工作的函数。

除了Fact之外,我想提供用于集合类的泛型参数<S>,我还想提供泛型参数<T> - {{1的实际类型}}

所以,我的第一个方法如下:

Collection

这非常有效,可以像:

一样使用
public static <T extends Collection<S>, S> T initializeCollection(Class<T> concreteClass, S... objects) {
    T result;

    try {
        result = concreteClass.newInstance();
        for (S s : objects) {
            result.add(s);
        }

        return result;
    } catch (InstantiationException e) {
        return null;
    } catch (IllegalAccessException e) {
        return null;
    }
}

LinkedList<String> myList = StaticHelper.initializeCollection(LinkedList.class, "a", "b");

从我现在测试到的,这可以按预期工作。唯一的问题是验证器声明,正在进行未保存的类型转换。使用Set的示例,验证器说

HashSet<Integer> mySet = StaticHelper.initializeCollection(HashSet.class, 1,2,3,4,5);

当我仔细查看返回值时,IDE会说明我的功能,它看起来像这样:

 Type safety: The expression of type HashSet needs unchecked conversion to conform to HashSet<Integer>

因此,验证者ofc认为,他必须进行从 <HashSet, Integer> HashSet my.namespace.helper.CollectionHelper.initializeCollection(Class<HashSet> concreteClass, Integer... objects) HashSet的无法预测。

但在我看来,该函数的返回值为HashSet<Integer>,其定义为T - 而不是Collection<S>

现在我想知道是否:

  • 我的功能存在问题,而且确实发生了无法解决的类型转发
  • IDE存在问题,没有显示正确的returnValue,因此验证器无法正常工作。

Sidenode: 即使已经发布了一个好的替代(我已经在使用),我对这个问题的解决方案非常感兴趣。

Collection

或使用

public static <T extends Collection<S>, S> T<S> initializeCollection ...

显然是无效的语法,但基本上看起来像需要什么。

1 个答案:

答案 0 :(得分:3)

不是一个直接的答案,但你可以通过以下方式简化:

@SafeVarargs
public static <T extends Collection<S>, S> T initializeCollection(T collection, S... objects) {
    Collections.addAll(collection, objects);
    return collection;
}

并将其命名为:

HashSet<Integer> mySet = initializeCollection(new HashSet<>(), 1, 2, 3, 4, 5);