Open lsj8367 opened 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의 하위타입>
을 받을수없습니다.
책에서 언급했던 유연성 이야기는 이부분인것같습니다
이 부분에 공변
Supplier<? extends Dictionary>
로 넣어주기보다는Dictionary
자체를 인터페이스로 만들어 상위 타입으로 두면 책과 다르게 공변을 안넣어도 되지 않을까요? 이 부분에서 다른분들은 어떻게 이해하셨는지 궁금합니다!