[TIL] 빌더 쓰다가 List<capture of ?>

wannabeing·2025년 4월 21일
2

SPARTA-TIL

목록 보기
13/22
post-thumbnail

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는 제네릭 추론에 소심(?)하니,
컴파일러가 확신을 갖지 못하면 <?>로 처리해버린다.

작은 디버깅이지만, 제네릭 타입 추론에 대해 한층 더 깊이 이해하게 된 기회였다!

profile
wannabe---ing

2개의 댓글

comment-user-thumbnail
2025년 4월 22일

정형돈까지 봤습니다. 이후는 나중에 다시 볼게요!

1개의 답글