[Java Error] both methods have same erasure

ohahsis·2024년 6월 27일

문제-분석-해결

목록 보기
3/5

📍 문제 상황

  • 도서 정보를 print 하는 메서드를 다음과 같이 같은 이름, 다른 파라미터로 오버로딩 하였다.
    private static void printBookInfo(Book<String> book) {}
    private static void printBookInfo(Book<Integer> book) {}
  • 다음과 같이 오류가 발생했다.

    both methods have same erasure

📍 분석

  • 자바의 제너릭은 컴파일과 런타임 시 다른 코드로 읽히도록 JVM이 관리한다.
  • 컴파일을 할 때 제너릭은 타입의 제약 조건을 사용하도록 정의하고, 런타임에 들어가면 소거를 하게 된다. 즉, 컴파일을 하는 시점에서 제너릭에 명시한 Object의 타입이 유효하지만, 런타임 시에는 제너릭에 명시한 Object의 타입이 소거되는 것을 말한다.
  • 즉, Book 이라는 Object 타입은 명시되지만, Book 의 제너릭 타입인 String 과 Integer 는 소거된다. 따라서 위에서 문제가 된 두 메서드는 다음과 같이, 사실 완전히 동일한 메서드로 인식되어 오버로딩 되지 않는 것이다.
    private static void printBookInfo(Book book) {}
    private static void printBookInfo(Book book) {}

📍 해결

  • 따라서 이러한 타입 소거에 따른 오버로딩 문제를, 메서드의 (기능과)이름을 달리 정의하여 해결하였다.

참고 자료

profile
백엔드 개발자입니다.

0개의 댓글