Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型问题_Java_Generics - Fatal编程技术网

Java泛型问题

Java泛型问题,java,generics,Java,Generics,我正在实现一个高阶拆分函数,它接受一个要拆分的项集合、一个定义拆分边界条件的筛选器委托,以及两个ReturnDelegate,它们是提供返回集合的具体集合类型的委托(因此,我不需要在split函数中修复ArrayList或HashSet,而是将返回集合的创建留给调用代码,从而产生灵活性) public final class Tuple2<T1, T2> { private T1 _item1; private T2 _item2; public Tup

我正在实现一个高阶拆分函数,它接受一个要拆分的项集合、一个定义拆分边界条件的筛选器委托,以及两个ReturnDelegate,它们是提供返回集合的具体集合类型的委托(因此,我不需要在split函数中修复ArrayList或HashSet,而是将返回集合的创建留给调用代码,从而产生灵活性)

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;
    }

}
以下是拆分方法:

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中的方法setItem1(T1)不适用于参数(集合)


想知道我做错了什么吗?

你的
t1
t2
应该是
t1
t2
类型:

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

Collection
不是
T1
的子类型,因此
setItem(T1)
将失败。

考虑只使用来自Guava()的
Iterables.filter()
,跳过所有这些。在您的情况下,您将同时使用
Iterables.filter(c,p)
Iterables.filter(c,Predicates.not(p))
来获取这两个子集。
public interface FilterReturnDelegate<R extends Collection<?>> {

    R createReturnCollection();

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