所以我有这个方法:
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”上的语法错误,预期
是什么给出的?我能解决这个问题吗?
答案 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;
}