나는 질문 에 대답 하고 있었다 설명 할 수없는 시나리오에 부딪쳤다. 이 코드를 고려하십시오.
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
}
}
람다의 매개 변수를 명시 적으로 입력 (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 컴파일러
편집 : Eclipse가 마지막 코드 줄을 컴파일하는 동안 maven으로 빌드 할 때 위의 코드가 컴파일되지 않습니다.