撒科打诨
首先给出我认为的正确写法吧(我copy了Predicat类,然后改名为PredicateExt进行重写)default PredicateExt negate() {
PredicateExt predicate = this;
PredicateExt otherPredicate = new PredicateExt() {
@Override
public boolean test(T t) {
return !predicate.test(t);
}
}; return otherPredicate;
}再来看看Java8中Predicate.negate到底表达的是什么意思Predicate肯定是一个类,(t) -> !test(t)这种lamdba语法也只是表示Predicate的一个对象而已default方法就是代表了Predicate对象的某个实例方法因此结合以上两点,可以直接看出Predicate.negate代表Predicate的某个对象A执行时,根据A的执行结果再次创建了一个新Predicate的对象B所以,要换种方式来表示Predicate.negate方法,肯定也要体现出A,B两个新旧对象,并且该方法的执行结果是根据A的执行结果体现出来的再来说说题主为什么会死循环,虽然题主已经明显new了一个Predicate对象,这里体现了A,B两个新旧对象,但是后面的执行结果并没有体现出是根据A的执行结果来产生B的主要在于里面的在重写B的test方法时,是再调用test方法的,只是前面加了一个!,所以显然这里调用的是B的Predicate的test方法,当然就是循环调用了,可别指望它能调用A的Predicate方法,因为你正在重写这个新Predicate的方法,这里的this指针,肯定是指向B的鉴于此,既然在B里面重写方法时this指针是指向B的,那就在外面显示的把A的对象指示出来,然后再B中重写时,显示用的A的方法进行执行,这样就可以了,所以才有上面的写法从运行的debug来看,以前的方式和现在重写的方式,在新的B对象中,都包含了以前的旧对象A的,所以是可行的