SRa*_*Raj 2 java generics java-8
我无法理解方法签名:
static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
Run Code Online (Sandbox Code Playgroud)
被super, extends, 通配符 ( ?) 和多个尖括号混淆。请不要误会我的意思,我了解基本的泛型。正是这里使用的更高的构造让我感到困惑。
所以函数的基本形式是
static <T, U> Comparator<T> comparing(Function<T, U> extractor)
稍后我们将处理更细粒度的修改。上面说的是,按顺序:
static: 简单明了,但重要的是,这意味着该函数未绑定到其对象实例的类型,因此即使Comparator在Comparator<T>我们仍在编写时已定义和实例化T...
<T, U>:这告诉我们函数本身对类型T和是通用的U。这就像你写的一样class <T, U> MyClass- 你说这些类型将定义函数其余部分的行为。在这种情况下,这些类型定义了函数的参数,并将根据我们提供的参数进行推断。如果我们给出 a Function<Foo,Bar>,comparing()那么编译器会推断出T = Foo.classand U = Bar.class。
Comparator<T>: 返回类型,一个可以比较的东西T;非常坦率的。
Function<T, U>:从T到的映射U;非常坦率的。
现在剩下的:
<T, U>is real <T,U extends Comparable<? super U>>,这意味着T无论什么都U需要扩展Comparable(即具有可比性),即使它实际上只是基于其超类型的可比性。例如,我可能有Bar extends Foowhere Foo implements Comparable; 我仍然可以Bar通过将它们视为Foo. 这是一个具体的例子:
MyBigInt implements Comparable<MyBigInt>。假设我们已经实现了Comparable接口,并且我们的类根据它的整数值进行了正确的比较。MyBigColorfulInt extends MyBigInt,它增加了一些愚蠢的非整数的功能-重要的是,它并没有实现Comparable<MyBigColorfulInt>,但作为子类MyBigInt它不会(隐含的)执行Comparable<MyBigInt>。<T, U extends Comparable<? super U>:假设我们的类型T包含一个 type 字段MyBigColorfulInt,我想根据它们的成员(这是)比较类型T的对象。如果签名是我们就不走运了:没有实现. 然而,无论如何,我们真的想比较's as 's 。让我们免费做这个,因为它可以根据它的超类进行比较。如果不是这样,我们能做的最好的事情就是在比较之前将每个都转换为,这不是很好。MyBigColorfulIntUU extends Comparable<U>MyBigColorfulIntComparable<MyBigColorfulInt>MyBigColorfulIntMyBigIntU extends Comparable<? super U>>UMyBigColorfulIntMyBigIntFunction<T, U>真的Function<? super T,? extends U>,一次一个:
<? super T>与上面关于 的观点类似U,所有这一切真正意味着我们必须能够从中提取一些东西来比较 ( U) T,如果我们提取的东西确实来自T的超类,那也没关系。
<? extends U>也类似(以不同的方式),以上面的一点:我们的功能需要提取类型的事情U进行比较,但是这是正常的,如果事情我们提取的后裔U,只要它可以被用来作为U作为我们比较的基础。