没有关于参数的额外信息的通用方法
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) -> { ... })
据我所知,这是一个通用方法(与通用方法 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) -> { ... })