小编kng*_*kng的帖子

Java thenComparing通配符签名

为什么声明是这样的:

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>所有相同的内容吗?

java generics wildcard comparator

12
推荐指数
2
解决办法
663
查看次数

为什么擦除仍然允许覆盖/实现?

乍一看,我认为以下是有道理的:

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 呢?

java generics erasure

6
推荐指数
1
解决办法
112
查看次数

Java 覆盖泛型方法

这是怎么编译的:

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 替换吗?那么为什么第二个例子无效呢?

java generics overriding

1
推荐指数
1
解决办法
139
查看次数

标签 统计

generics ×3

java ×3

comparator ×1

erasure ×1

overriding ×1

wildcard ×1