我想要创建一个通用方法来组合集合。
public class CollectionsHelper {
public static Set<?> combineSets(Set<?> set1, Set<?> set2){
return Collections.unmodifiableSet(new HashSet<?>() {{
addAll(set1);
addAll(set2);
}});
}
}但是我得到了编译错误:
通配符类型“?”不能直接实例化
发布于 2017-07-27 08:29:57
使用泛型类型参数而不是通配符:
public static <T> Set<T> combineSets(Set<T> set1, Set<T> set2)
{
return Collections.unmodifiableSet(new HashSet<T>() {{
addAll(set1);
addAll(set2);
}});
}再想一想,我不会使用匿名HashSet子类实例。我更喜欢:
public static <T> Set<T> combineSets(Set<T> set1, Set<T> set2)
{
HashSet<T> set = new HashSet<>(set1);
set.addAll (set2);
return Collections.unmodifiableSet(set);
}发布于 2017-07-27 08:33:30
您的错误正在发生,因为编译器不能保证您返回的Set<?>的Set<?>是两个Set<?>参数中的?类型的超级类型。
你想要的是一个通用的方法。类型参数需要是您在集合中使用的两种类型的超级类型。你可以这样做。
public static <E> Set<E> combineSets (Set<? extends E> set1, Set<? extends E> set2) {
Set<E> toReturn = new HashSet<E>();
toReturn.addAll(set1);
toReturn.addAll(set2);
return toReturn;
}? extends E部分很重要。这表明set1和set2不必是Set<E> --它们可以是E的任何子类的集合。类型推断将使E成为这两种类型中最低的超类。
如果您确实需要这是一个不可修改的集合,那么将最后一行更改为
return Collections.unmodifiableSet(toReturn);https://stackoverflow.com/questions/45345289
复制相似问题