我遇到了泛型问题让我对编译器实际处理泛型类型的方式感到困惑.考虑以下:
// 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)
所以问题是:这里发生了什么?我怀疑这是由于编译器的一些奇怪行为而不是预期的语言规范?或者我错过了一些明显的东西?