gpt4 book ai didi

Java泛型问题

转载 作者:行者123 更新时间:2023-11-29 06:23:21 25 4
gpt4 key购买 nike

我正在实现一个高阶拆分函数,它接受要拆分的项目的集合,一个定义拆分边界标准的过滤器委托(delegate),以及两个 ReturnDelegate,它们是提供具体集合类型的委托(delegate)返回集合(因此我不需要在 split 函数中修复 ArrayList 或 HashSet,而是将返回集合的创建留给调用代码,从而产生灵 active )。返回的是一个 Tuple2 类,它基本上是两个异构对象的包装器。

拆分方法如下:

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

}

过滤代理:

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

}

过滤返回委托(delegate):

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应该是 T1 类型和 T2 :

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

Collection<T>不是 T1 的子类型, 所以 setItem(t1)会失败。

关于Java泛型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2096832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com