[英]Java generic methods: super can't be used?
所以我有這種方法:
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”的語法錯誤,預期
是什么賦予了? 我可以解決這個問題嗎?
這是一個解釋為什么不允許這樣做的鏈接:
http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ107
它基本上只是說在類型參數中使用super“不會買任何東西”,因為如果允許的話,擦除可能只會將其擦除到Object
,這沒有什么意義。
這里有兩個想法。 第一個僅返回通用Collection
,第二個返回實際result
-type:
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;
}
好吧,我沒有完全回答我的問題,但這是我的問題可以接受的解決方案:
protected <T extends Collection<? super MyItemClass>>
T collectSelectedItems(ListSelectionModel lsm, T result) {
for (int i : GUI.getSelectionIndices(lsm))
{
result.add(getItemByDisplayIndex(i));
}
return result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.