gpt4 book ai didi

java - 在 Guava 中,为什么在可能使用 "T"的地方只使用 "? super T"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:46:53 26 4
gpt4 key购买 nike

为什么实用程序工厂方法经常使用特定的通用参数(如 T )而不是有界通配符参数(如 ? super T )?

例如Functions#forPredicate的签名是:

public static <T> Function<T, Boolean> forPredicate(Predicate<T> predicate)

为什么不使用:

public static <T> Function<T, Boolean> forPredicate(Predicate<? super T> predicate)

哪个可以使类似下面的事情成为可能?

Predicate<Number> isPositivePredicate = ...
Function<Integer, Boolean> isPositiveInteger = Functions.forPredicate(isPositivePredicate);
// above line is compiler error:
// Type mismatch: cannot convert from Function<Number,Boolean> to Function<Integer,Boolean>

是因为 Function消费者Predicate期望有必要的有界通配符参数来使这不必要吗?例如,Iterables#find 上的通用边界将允许 Predicate<Number>用于 Iterable<Integer> :

public static <T> T find(Iterable<T> iterable,
Predicate<? super T> predicate)

还有其他原因吗?

最佳答案

是的,我们希望消费者拥有正确的有界通配符参数是绝对准确的,但我还想到了另外几个原因:

  • 一般来说,除非我们有特定的理由,否则我们不会扩大泛型方法的类型。这项政策已取得多次成效。
  • Java 的类型推断并不总是能够自动找出更高级的泛型,因此保留较窄的泛型可以减少需要显式指定 T 的用户数量。

关于java - 在 Guava 中,为什么在可能使用 "T"的地方只使用 "? super T"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14631353/

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