如何在java中返回泛型Collection

时间:2014-07-22 08:35:29

标签: java generics collections arraylist set

我想做这样的事情,但它没有明确的工作,有什么建议吗?

public HashSet<?> insert(String word, int val, HashSet<?> set) {

    if (val > 30) set.add(word);
    else set.add(val);

    return set;
}

2 个答案:

答案 0 :(得分:1)

您唯一能做的就是,因为您要为Set添加值,并且您有IntegerString作为可能的类型(仅Object public HashSet<Object> insert(String word, int val, HashSet<Object> set) { if (val > 30) { set.add(word); } else { set.add(val); } return set; } 1}}作为一个普通的超类),是:

Set

此处的问题是,当您返回Integer时,将强制将元素投射到某个特定类型(String或{{1}})。可能您需要花一些时间来重新设计模型,然后尝试使用Generic类型高效地工作。

答案 1 :(得分:0)

试试这个(但不起作用):

public <T> Set<T> insert(String word, int val, Set<T> set) 
{
    if(val > 30)
    {
        set.add(word);
    }
    else 
    {
        set.add(val);
    }

    return set;
}

顺便说一下,这个方法里面的代码只适用于Set<Object>,这有点破坏了泛型。

编辑:的确,它不起作用,因为T需要绑定扩展String和Integer,这是不可能的。

通用的方式如下:

public <T> Set<T> insert(T t, Set<T> set)
{
    set.add(t);
    return set;
}

这样,您只能将特定类型的元素放入Set中,这样您在检索它们时就不需要进行强制转换。例如,

public static void main(String[] args)
{
    Set<String> set = new HashSet<String>();
    insert("Hello", set);
    insert("World!", set);
    for(String string : set)
    {
        System.out.println(string);
    }
    insert(562, set); //won't compile because it allows only strings
}