Java通用方法:超级can';不能用吗?

Java通用方法:超级can';不能用吗?,java,generics,bounded-wildcard,Java,Generics,Bounded Wildcard,所以我有这个方法: protected void collectSelectedItems(ListSelectionModel lsm, Collection<? super MyItemClass> result) { for (int i : GUI.getSelectionIndices(lsm)) { result.add(getItemByDisplayIndex(i)); } } 但是我在super上发现了一

所以我有这个方法:

protected void collectSelectedItems(ListSelectionModel lsm, 
         Collection<? super MyItemClass> result) {
    for (int i : GUI.getSelectionIndices(lsm))
    {
        result.add(getItemByDisplayIndex(i));
    }
}
但是我在
super
上发现了一个语法错误:

令牌“super”上的语法错误,应为


有什么好处?我能解决这个问题吗?

嗯,我没有准确回答我的问题,但这是一个可以接受的解决方案:

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

protected这里有两个想法。第一个只返回一般的
集合
,第二个返回实际的
结果
-类型:

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;
}
public Collection ver1(Collection src,Collection dst)
{
dst.addAll(src);
返回dst;
}
公共T版本2(集合src、T dst)
{
dst.addAll(src);
返回dst;
}

这里有一个链接解释了为什么不允许这样做:


它基本上只是说,在类型参数中使用super“不会给您带来任何好处”,因为如果允许的话,擦除可能只会将其擦除到
对象
,这没有多大意义。

错误说明了什么?您想如何调用它?
对象
MyItemClass
的超级对象,因此
集合
可以是
集合
。我认为你不能在这里使用
super
。SLaks,Kerrek:只是编辑答案来解决你的问题。Peter,为什么不呢?PECS:我正在传递一个MyItemClass的使用者,因此我需要使用
super
而不是
extends
如果你想声明你的方法来获取一个
比较器,它会“给你买些东西”。这不是链接页面所说的-它明确地说,如果在方法声明中允许super,这将有助于创建类型安全的泛型方法。现在我遇到的例子是Optional的orElse:它只接受与Optional相同的类型,尽管说
Optional=…,通常是非常有意义的。。。;Supertype结果=可选的.orElse(supertypeInstance)
protected <T extends Collection<? super MyItemClass>> 
  T collectSelectedItems(ListSelectionModel lsm, T result) {
    for (int i : GUI.getSelectionIndices(lsm))
    {
        result.add(getItemByDisplayIndex(i));
    }
    return 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;
}