我正在回答一个问题,遇到了无法解释的情况。考虑以下代码:
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)
会使代码编译。另外,为什么它链接到in中的超载Iterable
而不是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成功编译了最后一行代码。