11

だから私はこの方法を持っています:

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" の構文エラー、予想される

何を与える?これを修正できますか?

4

3 に答える 3

7

これが許可されていない理由を説明する 1 つのリンクを次に示します。

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ107

これは基本的に、型パラメータで super を使用しても「何も買わない」と言っているだけObjectです。

于 2011-12-06T17:10:05.447 に答える
2

ここに2つのアイデアがあります。1 つ目は generic のみを返しCollection、2 つ目は実際の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;
}
于 2011-12-06T17:04:22.323 に答える
1

まあ、私は私の質問に正確に答えませんでしたが、これは私の問題に対する許容可能な解決策です:

protected <T extends Collection<? super MyItemClass>> 
  T collectSelectedItems(ListSelectionModel lsm, T result) {
    for (int i : GUI.getSelectionIndices(lsm))
    {
        result.add(getItemByDisplayIndex(i));
    }
    return result;
}
于 2011-12-06T16:48:06.820 に答える