人们常常需要一组快速的值,以便能够对其进行迭代。我不想手动创建实例、添加项目或执行众所周知的构造函数初始化,从数组列表中创建一个集合 (Set<String> mySet = new HashSet<String>(Arrays.AsList("a", "b", "c"))
),我想创建一个函数来为我完成这项工作。
除此之外,我还想提供通用参数 <S>
用于集合类,我还想提供通用参数 <T>
- 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");
或
HashSet<Integer> mySet = StaticHelper.initializeCollection(HashSet.class, 1,2,3,4,5);
根据我目前的测试,它按预期工作。唯一的问题是 validator 声明正在进行未保存的类型转换。使用集合的示例, validator 说
Type safety: The expression of type HashSet needs unchecked conversion to conform to HashSet<Integer>
当我仔细查看 IDE 为我的函数声明的返回值时,它看起来像这样:
<HashSet, Integer> HashSet my.namespace.helper.CollectionHelper.initializeCollection(Class<HashSet> concreteClass, Integer... objects)
因此验证者 ofc 认为,他必须从 HashSet
进行取消保存转换。至 HashSet<Integer>
.
但在我看来,函数的返回值是T
,这几乎被定义为 Collection<S>
- 而不是 Collection
.
现在我想知道是否:
- 我的函数有问题,真的发生了未保存的类型转换
- IDE 存在问题,未显示正确的 returnValue,因此 validator 无法正常工作。
侧节点: 即使已经发布了一个很好的替代方案(我已经在使用),我还是对这个问题的解决方案很感兴趣。
public static <T extends Collection<S>, S> T<S> initializeCollection ...
或使用
... initializeCollection(HashSet<Integer>.class,...
显然是无效语法,但基本上看起来需要什么。
最佳答案
不是真正的直接答案,但您可以通过以下方式使其更简单:
@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);
关于java - 钻石运营商;初始化参数化泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21576082/