3.5 퀴즈 3-5 메소드 오버로딩

kkambbak1·2023년 3월 31일
0

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

profile
윤성

0개의 댓글