我有一个 Predicate
我想用在一些操作中。然而,我有一个艰难的类型使多态性工作。
经过一些调查,我写了下面的最小代码来重现这个问题(这是一个比我能描述的更好的问题解释)。
class Custom implements Predicate<Integer> {
int y;
public Custom(int y) {
this.y = y;
}
@Override
public boolean test(Integer i) {
return y+i>0;
}
}
public class Main{
public static void main(String[] args) {
Custom c1 = new Custom(5);
Custom c2 = new Custom(8);
Custom c = (Custom) c1.and(c2); // faulty line - unable to cast
}
}
我不知道为什么铸造失败,以及如何使它工作。
2条答案
按热度按时间iugsix8n1#
如果你想保持你的状态
Custom
对象并实现Predicate
接口,我建议重载and
,or
以及negate
方法。当你把两者结合起来Custom
对象and
,or
或者当你打电话的时候negate
你会得到一个Custom
对象作为返回值。当你把一个Custom
对象的任何其他实现Predicate<Integer
方法仍将返回Predicate<Integer
:ruyhziif2#
我看不出有什么好的理由来创建这样一种 predicate ,因为它会使 predicate 复杂化。然而,至少有3种不同的方式进入我的脑海“改变” predicate 状态。
v0-只需使用java.util.function.predicate
这段代码没有什么问题,我仍然坚持不实现任何自定义类。
v1—自定义 predicate 实现中的“do cast”
这仍然需要来自
Predicate<T>
要重写的接口,以便在将来的java版本中不会中断。这似乎是最接近你想要完成的。
v2-从外部注入 predicate 状态
此实现要求状态从管理要处理的多个对象的外部更改,还要求“state”类,但不要求重写默认方法,还要求供应商在每个
test
方法调用。