Java泛型方法:超级不能用?

时间:2011-12-06 16:39:30

标签: java generics bounded-wildcard

所以我有这个方法:

protected void collectSelectedItems(ListSelectionModel lsm, 
         Collection<? super MyItemClass> result) {
    for (int i : GUI.getSelectionIndices(lsm))
    {
        result.add(getItemByDisplayIndex(i));
    }
}

我想返回集合而不是使用void方法:

protected <T super MyItemClass> Collection<T> 
  collectSelectedItems(ListSelectionModel lsm, Collection<T> result) {
    for (int i : GUI.getSelectionIndices(lsm))
    {
        result.add(getItemByDisplayIndex(i));
    }
    return result;
}

意图做这样的事情(MyItemClass extends MyItemBaseClass):

List<MyItemBaseClass> list = 
   collectSelectedItems(lsm, new ArrayList<MyItemBaseClass>());

但我在super上收到语法错误:

  

令牌“super”上的语法错误,预期

是什么给出的?我能解决这个问题吗?

3 个答案:

答案 0 :(得分:5)

以下是一个链接,解释了为什么不允许这样做:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ107

它基本上只是说在类型参数中使用super“不会给你任何东西”,因为如果允许这样做,擦除可能只是将它擦除到Object,这没有多大意义。

答案 1 :(得分:2)

这是两个想法。第一个只返回通用Collection,第二个返回实际的result - 类型:

public <T, S extends T> Collection<T> ver1(Collection<S> src, Collection<T> dst)
{
    dst.addAll(src);
    return dst;
}

public <U, T extends Collection<U>, S extends U> T ver2(Collection<S> src, T dst)
{
    dst.addAll(src);
    return dst;
}

答案 2 :(得分:0)

好吧,我没有完全回答我的问题,但这对我的问题是可以接受的解决方案:

protected <T extends Collection<? super MyItemClass>> 
  T collectSelectedItems(ListSelectionModel lsm, T result) {
    for (int i : GUI.getSelectionIndices(lsm))
    {
        result.add(getItemByDisplayIndex(i));
    }
    return result;
}