gpt4 book ai didi

java - 在 Java 中,如何决定 Predicate "and"方法有一个消费者而不是生产者?

转载 作者:行者123 更新时间:2023-12-05 08:21:59 25 4
gpt4 key购买 nike

我正在研究 java 8 中引入的 Predicate 类,它是函数式接口(interface)。Predicate 类中有如下方法,用于将多个谓词组合成一个。

default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}

我已经阅读了 Java 中 PECS 的概念,但仍然不明白为什么在 Predicate 的情况下我们使用 ? super T。 java 程序员如何决定它是消费者而不是生产者。

我的意思是为什么不允许有编译错误的行:

public class PredicateExample {
public static void main(String[] args) {
Predicate<Number> pred = n -> n.intValue() > 2;
Predicate<Integer> predInt = n -> n > 3;
//Compile error
//pred.and(predInt);

Predicate<Object> predObj = o -> Integer.parseInt(o.toString()) > 4;
pred.and(predObj); //Valid statement

Number n = new Integer(100);
System.out.println(pred.and(predObj).test(10));
System.out.println(predInt.and(pred).test(10));
//Compile error
//System.out.println(pred.and(predInt).test(10));
}
}

最佳答案

Predicate<T>让我们接受 T给你一个boolean .是的,它是boolean的生产者s,但这在这里并不真正相关。 在类型参数上应用 PECS 时,您应该考虑该类型是该类型参数的生产者还是消费者

Predicate<T>接受 T , 它是 T 的消费者, 所以它应该是 ? super对于 T参数。

另一个例子:BiFunction<T, U, V>接受 T和一个 U , 并产生一个 V , 所以它是 T 的消费者, 消费者 U ,以及 V 的生产商.因此,? super对于 TU , ? extends对于 V .如您所见,只有类型参数很重要。该类型可能执行的任何其他操作都不会执行。

如果翻转两侧,则允许使用线条 - predInt.and(pred) ,它创建了一个 Predicate<Integer> .

这是因为 and被声明为产生与调用它的谓词相同类型的谓词,因此 pred.and(...)只能产生一个Predicate<Number> ,而是一个 Predicate<Number>在这里没有意义 - 另一个合取只能接受整数!

您完全可以让它在两个订单中工作。如果你声明 and作为静态方法:

public static <T> Predicate<T> and(Predicate<? super T> a, Predicate<? super T> b)

然后你可以做这两个:

and(predInt, pred)
and(pred, predInt)

但这样可读性较差:(

关于java - 在 Java 中,如何决定 Predicate "and"方法有一个消费者而不是生产者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67749063/

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