没有关于参数的额外信息的通用方法

Generic methods with no extra information on Parameter

据我所知,这是一个通用方法(与通用方法 class 相对):

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
        Function<? super T, ? extends U> keyExtractor)

我很好奇 Java 如何决定我传入的任何 keyExtractor lambda 的参数类型,假设 T 是参数化的。

如果有一些额外的信息,比如如果 T 对于某些具体的 Z 被限制为 T super Z,那么你只能传入 Z 的 subclass 是有道理的,因此在 keyExtractor lambda 中我可以进行类型检查,就好像传入了一个 class Z 对象一样。

但是鉴于没有关于 T 的可用信息,这怎么行呢? 它是否根据 comparing 返回的 lambda 的使用情况来决定? 我很困惑,但也许我没有完全理解泛型和 lambdas。

任何澄清将不胜感激,谢谢!

But given that there's no information available on T, how does this even work?

如果真的T上没有可用的信息,那么它默认为Object,比如当你调用comparing时独立声明:

Comparator.comparing(x -> { ... });

x 的编译时类型将为 Object

但你很少这样称呼 comparing,对吧?您通常将其 return 值传递给方法,或者至少首先将其分配给已知类型的变量:

someMethod(Comparator.comparing(x -> { ... }));
// or
Comparator<SomeType> c = Comparator.comparing(x -> { ... });

在这两种情况下,都有更多信息可以确定 T 是什么。请注意 comparing 的 return 类型是 Comparator<T>,因此如果上面的 someMethod 接受 Comparator<SomeType>,类型推理引擎可以计算出 T 在这两种情况下都必须是 SomeType

另请注意,您可以在 lambda 中指定参数的类型,这也有助于推断 T

Comparator.comparing((SomeType x) -> { ... })