首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >集初始化的泛型方法

集初始化的泛型方法
EN

Stack Overflow用户
提问于 2017-07-27 08:28:15
回答 2查看 63关注 0票数 2

我想要创建一个通用方法来组合集合。

代码语言:javascript
复制
public class CollectionsHelper {
    public static Set<?> combineSets(Set<?> set1, Set<?> set2){
        return Collections.unmodifiableSet(new HashSet<?>() {{
            addAll(set1);
            addAll(set2);
        }});
    }
}

但是我得到了编译错误:

通配符类型“?”不能直接实例化

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-27 08:29:57

使用泛型类型参数而不是通配符:

代码语言:javascript
复制
public static <T> Set<T> combineSets(Set<T> set1, Set<T> set2)
{
    return Collections.unmodifiableSet(new HashSet<T>() {{
        addAll(set1);
        addAll(set2);
    }});
}

再想一想,我不会使用匿名HashSet子类实例。我更喜欢:

代码语言:javascript
复制
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);
}
票数 7
EN

Stack Overflow用户

发布于 2017-07-27 08:33:30

您的错误正在发生,因为编译器不能保证您返回的Set<?>Set<?>是两个Set<?>参数中的?类型的超级类型。

你想要的是一个通用的方法。类型参数需要是您在集合中使用的两种类型的超级类型。你可以这样做。

代码语言:javascript
复制
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部分很重要。这表明set1set2不必是Set<E> --它们可以是E的任何子类的集合。类型推断将使E成为这两种类型中最低的超类。

如果您确实需要这是一个不可修改的集合,那么将最后一行更改为

代码语言:javascript
复制
return Collections.unmodifiableSet(toReturn);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45345289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档