pagedFeed.map(...) -> Page<FeedResponseDto>
pagedFeed.map(...).getContent() -> List<FeedResponseDto>
위와 같이 인식하겠지? 라는 생각으로
변수 타입을 List<FeedResponseDto>
를 사용했는데 위와 같은 에러가 떴다.
💭 자바 컴파일러의 생각
- 자바컴파일러는 feedPage는
Page<Feed>
라고 생각함- feedPage.map(...)에서 FeedResponseDto 빌더로 객체를 생성하여 반환하니까
Page<FeedResponseDto>
가 될 것 같지만,
컴파일러의 제네릭 추론은 굉장히 보수적임- 따라서
Page<?>
타입으로 반환되고, getContent()를 통해List<?>
로 반환됨
feedPage.map(...)의 리턴 타입은 Page<T>
이다.
따라서 feedPage.map(...).getContent()는 List<T>
를 반환
💡 즉, 핵심은 T가 무엇이냐
따라서 아래와 같이 한번 Page<?>
를 명시해주면,
컴파일러가 확신을 갖고 우리가 원하는 타입으로 인식할 수 있다!
Page<FeedResponseDto> feedPageResponseDto = feedPage.map(
feed ->
FeedResponseDto.builder()
....
.build()
); // ✅ Page<> 명시
List<FeedResponseDto> feeds = feedPageResponseDto.getContent();
✅ 람다에서 타입을 추론하더라도,
반환 타입이 제네릭이라면 외부에서 명시적으로 작성해주는게 좋다.
특히 Java는 제네릭 추론에 소심(?)하니,
컴파일러가 확신을 갖지 못하면 <?>
로 처리해버린다.
작은 디버깅이지만, 제네릭 타입 추론에 대해 한층 더 깊이 이해하게 된 기회였다!
정형돈까지 봤습니다. 이후는 나중에 다시 볼게요!