为什么声明是这样的:
default <U extends Comparable<? super U>> Comparator<T> thenComparing(
Function<? super T, ? extends U> keyExtractor)
Run Code Online (Sandbox Code Playgroud)
我明白了大部分。U可以是任何东西,只要它可以与自身的超类相比较,因此也可以与自身相比较,这是有道理的。
但我没有得到这部分: Function<? super T, ? extends U>
为什么不只有: Function<? super T, U>
U 不能只是参数化为 keyExtractor 返回的任何内容,并且仍然扩展Comparable<? super U>所有相同的内容吗?
乍一看,我认为以下是有道理的:
interface Test<T> {
T getValue(T n);
}
class Impl implements Test<Integer>{
public Integer getValue(Integer n){
return n;
}
}
Run Code Online (Sandbox Code Playgroud)
它编译正确,所以一切看起来都很好。
但是后来我在擦除的上下文中考虑了更多,在我看来,Test 接口被擦除为:
interface Test {
Object getValue(Object n);
}
Run Code Online (Sandbox Code Playgroud)
那么 Impl 怎么还能实现 Test 呢?
这是怎么编译的:
interface Test {
<T extends Integer> T getValue(T n);
}
class Impl implements Test{
public Integer getValue(Integer n) {
return n;
}
}
Run Code Online (Sandbox Code Playgroud)
但这不会:
interface Test {
Integer getValue(Integer n);
}
class Impl implements Test{
public <T extends Integer> T getValue(T n){
return n;
}
}
Run Code Online (Sandbox Code Playgroud)
它给了我以下编译错误:
Impl 不是抽象的,并且不会覆盖 Test 中的抽象方法 getValue(Integer)
错误:名称冲突:Impl 中的 getValue(T) 和 Test 中的 getValue(Integer) 具有相同的擦除,但都不覆盖另一个
擦除不能确保 T 被 Integer 替换吗?那么为什么第二个例子无效呢?