提问人:SoullessWarrior 提问时间:9/8/2023 最后编辑:HolgerSoullessWarrior 更新时间:9/8/2023 访问量:61
在 Java 中使用泛型类型的静态函数
static functions using generic types in Java
问:
当我遇到以下函数时,我正在查看 java.util.function 中 Predicate 的源代码(对于上下文来说,它是一个函数接口,它返回一个布尔值,采用了 T 类型的一些通用输入):
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
@SuppressWarnings("unchecked")
static <T> Predicate<T> not(Predicate<? super T> target) {
Objects.requireNonNull(target);
return (Predicate<T>)target.negate();
}
我对静态函数如何与所有这些泛型类型一起使用感到困惑。这是怎么回事?
我期待某种类型推理使这种情况发生。在第一种方法中,返回函数是一个可以隐式输入的函数,但是由于参数是类型,我希望这只能变成一个类型的类,在我看来,这完全违背了在函数中使用的意义。Predicate<T>
targetRef
Object
Predicate<Object>
T
第二个函数,我甚至想不出一个合理的推理模式,看起来很荒谬。返回类型被转换为 ,但会返回 ,这使得接受超级参数本身很奇怪,而且,由于 return 语句中的类型转换,以及参数中的模糊性,不可能从中知道一个明智的。这两种方法是如何工作的,为什么这样定义它们?Predicate<T>
target.negate
Predicate<? super T>
T
答:
我们总是可以显式指定类型:
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: (T object) -> targetRef.equals(object);
}
所以 while 是类型 ,是类型 。targetRef
Object
object
T
T
取决于调用上下文,例如:
Predicate.isEqual(something); // T == Object
Predicate.<String>isEqual(something); // T == String
Predicate<Double> p = Predicate.isEqual(something); // T == Double
Stream.of(1,2,3).filter(Predicate.isEqual(2)); // T == Integer
评论
Predicate<String> p = Predicate.isEqual(myInteger);
T
T
Predicate<String>
Predicate<Object>
String
对于第一个函数,该方法始终采用 .您可能希望只采用其自身类型的参数,但这不是它的作用。这样一来,参数就只能由调用者的需求来推断:您可以轻松地传递给期望 的东西,这将正常工作(并且始终返回)。equals
Object
Object::equals
<T>
isEqual("")
Predicate<Integer>
false
第二个函数以大致相同的方式从调用方推断。just的意思是“任何可以消费的东西”。强制转换是必需的,因为编译器无法知道返回的 by 作为 .<T>
super
Predicate
T
Predicate
negate
Predicate<T>
评论
T
Predicate<T>
equals