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;
}