小编n24*_*47s的帖子

泛型 - 编译器不一致[jdk 1.8.0_162]

我遇到了泛型问题让我对编译器实际处理泛型类型的方式感到困惑.考虑以下:

// simple interface to make it a MCVE
static interface A<F, S> {
    public F getF();    
    public S getS();
}

static <V, S> Comparator<A<V, S>> wrap(Comparator<S> c) {
    return (L, R) -> c.compare(L.getS(), R.getS());
}
Run Code Online (Sandbox Code Playgroud)

以下将不会编译,因为两个泛型类型都减少为Object调用时thenComparing:

Comparator<A<String, Integer>> c = wrap((L, R) -> Integer.compare(L, R))
    .thenComparing(wrap((L, R) -> Integer.compare(L, R)));
Run Code Online (Sandbox Code Playgroud)

但是如果我像下面的例子那样将它们分解,那么一切都正确地编译(并运行):

Comparator<A<String, Integer>> c = wrap((L, R) -> Integer.compare(L, R));
c = c.thenComparing(wrap((L, R) -> Integer.compare(L, R)));
Run Code Online (Sandbox Code Playgroud)

所以问题是:这里发生了什么?我怀疑这是由于编译器的一些奇怪行为而不是预期的语言规范?或者我错过了一些明显的东西?

java generics compiler-errors java-8

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

标签 统计

compiler-errors ×1

generics ×1

java ×1

java-8 ×1