簡體   English   中英

Java通用方法:超級不能使用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM