https://github.com/BanditBool2/ReadingRecord/issues/13
컴파일러는 람다식을 인터페이스 타입으로 추론하고 인터페이스의 구현 객체를 생성한다고 합니다. 그래서 인터페이스 타입이 명시적으로 캐스팅되지 않으면 컴파일러는 어떤 인터페이스를 구현하는 객체를 생성해야 할 지 알지 못해 컴파일 에러가 발생합니다.
위 코드를 작성해보면 다음과 같습니다.
public class Main{
public static void main(String[] args) {
execute(()->{}); //에러 발생 (실행 가능 후보가 1개보다 많다)
}
static public void execute(Runnable runnable) {
runnable.run();
}
static public void execute(Action action){
action.act();
}
}
@FunctionalInterface
interface Action{
void act();
}
이때 에러 메세지를 보면
실행할 수 있는 후보가 2개가 있어서 에러가 납니다.
따라서 execute((Action) ()->{}); 과 같이 어떤 함수형 인터페이스를 사용하는지 명시해야 합니다.
여러 함수형 인터페이스가 실행 가능한 경우 어떤 함수형 인터페이스를 구현했는지 캐스팅을 통해 명시해야만 컴파일러가 이를 바탕으로 추론할 수 있습니다.
하지만 함수형 인터페이스가 유일하다면 컴파일러가 추론이 가능하므로 캐스팅을 해주지 않아도 됩니다.
위 과정을 거쳐 컴파일러는 해당 인터페이스를 구현하는 객체를 생성해서 코드를 실행합니다.
도움주신 분: hanbonghun