我在回答一个问题时遇到了一个我无法解释的场景。考虑这段代码:
interface ConsumerOne<T> {
void accept(T a);
}
interface CustomIterable<T> extends Iterable<T> {
void forEach(ConsumerOne<? super T> c); //overload
}
class A {
private static CustomIterable<A> iterable;
private static List<A> aList;
public static void main(String[] args) {
iterable.forEach(a -> aList.add(a)); //ambiguous
iterable.forEach(aList::add); //ambiguous
iterable.forEach((A a) -> aList.add(a)); //OK
}
}
我不明白为什么显式输入 lambda 的参数(A a) -> aList.add(a)
会使代码编译。此外,为什么它链接到重载 inIterable
而不是 in CustomIterable
?
对此是否有一些解释或指向规范相关部分的链接?
注意:仅在扩展iterable.forEach((A a) -> aList.add(a));
时编译(直接重载方法会导致模棱两可的错误)CustomIterable<T>
Iterable<T>
CustomIterable
两者兼得:
- openjdk 版本“13.0.2” 2020-01-14
Eclipse 编译器 - openjdk 版本“1.8.0_232”
Eclipse 编译器
编辑:上面的代码在使用 maven 构建时无法编译,而 Eclipse 成功编译了最后一行代码。