具有多个匹配目标类型的 lambda 表达式的方法签名选择
我正在回答一个问题,遇到了一个我无法解释的场景。请考虑以下代码:
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)
Iterable
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 compiler
编辑:上面的代码无法在使用maven构建时编译,而Eclipse成功编译最后一行代码。