簡體   English   中英

Java泛型問題

[英]Java generics problem

我正在實現一個高階拆分函數,該函數接受要拆分的項目的集合,一個定義拆分邊界條件的過濾器委托,以及兩個ReturnDelegate,這兩個委托提供了return集合的具體收集類型(因此,我不需要在split函數中修復ArrayList或HashSet,而是將返回集合的創建留給調用代碼,從而產生靈活性)。 返回的是Tuple2類,它基本上是兩個異構對象的包裝。

這是split方法:

public static <T, T1 extends Collection<T>, T2 extends Collection<T>>
    Tuple2<T1, T2> split(final Collection<T> coll,
                         final FilterDelegate<T> filterDelegate,
                         final FilterReturnDelegate<T1> truthyDelegate1,
                         final FilterReturnDelegate<T2> falsyDelegate2) {
    final Collection<T> t1 = truthyDelegate1.createReturnCollection();
    final Collection<T> t2 = falsyDelegate2.createReturnCollection();

    for (final T item : coll) {
        if (filterDelegate.filter(item)) {
            t1.add(item);
        } else {
            t2.add(item);
        }
    }

    final Tuple2<T1, T2> retval = new Tuple2<T1, T2>();
    retval.setItem1(t1);
    retval.setItem2(t2);

    return retval;
}

這是Tuple2類。 它是異構對象的簡單的通用感知包裝器。

public final class Tuple2<T1, T2> {

    private T1 _item1;

    private T2 _item2;

    public Tuple2() {
    }

    public Tuple2(final T1 item1, final T2 item2) {
        _item1 = item1;
        _item2 = item2;
    }

    public T1 getItem1() {
        return _item1;
    }

    public T2 getItem2() {
        return _item2;
    }

    public void setItem1(final T1 item1) {
        _item1 = item1;
    }

    public void setItem2(final T2 item2) {
        _item2 = item2;
    }

}

FilterDelegate:

public interface FilterDelegate<T> {

    /**
     *
     * @param item The item to be filtered.
     * @return true if the item should be retained. false if the item should be
     */
    boolean filter(T item);

}

FilterReturnDelegate:

public interface FilterReturnDelegate<R extends Collection<?>> {

    R createReturnCollection();

}

但是,上面的split方法甚至無法編譯。 Javac在線抱怨

retval.setItems(t1); retval.setItems(t2);

"The method setItem1(T1) in the type Tuple2<T1,T2> is not applicable for the arguments (Collection<T>)"

想知道我在這里做錯了什么嗎?

您的t1t2應該是T1T2類型:

final T1 t1 = truthyDelegate1.createReturnCollection();
final T2 t2 = falsyDelegate2.createReturnCollection();

Collection<T>不是T1的子類型,因此setItem(t1)將失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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