通常需要快速收集值才能迭代它。而不是手动创建实例,添加项目或执行众所周知的构造函数初始化,从数组(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>
。
现在我想知道是否:
Sidenode: 即使已经发布了一个好的替代(我已经在使用),我对这个问题的解决方案非常感兴趣。
Collection
或使用
public static <T extends Collection<S>, S> T<S> initializeCollection ...
显然是无效的语法,但基本上看起来像需要什么。
答案 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);