back-end-study / effective-java

🔥 이펙티브 자바 스터디
42 stars 4 forks source link

[Item5] Supplier<T> 에서 공변으로 유연하게 가져갈 수 있을까? #15

Open lsj8367 opened 2 years ago

lsj8367 commented 2 years ago

이 부분에 공변 Supplier<? extends Dictionary> 로 넣어주기보다는 Dictionary 자체를 인터페이스로 만들어 상위 타입으로 두면 책과 다르게 공변을 안넣어도 되지 않을까요? 이 부분에서 다른분들은 어떻게 이해하셨는지 궁금합니다!

youngreal commented 2 years ago

이미 다 알고계실것 같지만 그래도 제가 아는것 최대한 공유해보려고합니다!

https://youtu.be/ipT2XG1SHtQ 예전에 위에영상보며 공부했던 부분중 하나인데요

static void printList(List<Object> list){
   list.forEach(s-> print(s));
}

static void printList2(List<? extends Object> list){
   list.forEach(s-> print(s));
}

public static void main(String[] args){
   List<Integer> list = Arrays.asList(1,2,3);
   printList(list); // 컴파일에러
   printList2(list); // 문제없음,  List<Object>와 List<? extends Object> 와는 다릅니다
}

Integer는 Object의 서브타입이지만, List<Integer>List<Object>의 서브타입이 아닙니다. 두 유형의 공통부모는 List<?>입니다 말씀주신 방식처럼 Supplier<Dictionary>로 선언한다면 Supplier<Dictionary의 하위타입>을 받을수없습니다. 책에서 언급했던 유연성 이야기는 이부분인것같습니다