Supplier의 한정적 와일드카드를 사용하는 이유에 대한 제 생각은 이렇습니다.
강의 너무 잘 듣고 있습니다. 제가 이해한 문맥이 맞는지 확인하고자 글 남깁니다! 선생님께서는 SpellChecker 생성자의 매개변수에 곧바로 람다 또는 메서드 참조를 사용하셨기에 강의에서는 드러나지 않았으나(혹은 매개변수에 람다식을 작성한 후 변수로 추출. 이 경우에는 Supplier<Dictionary> 타입으로 추출됨),책에서는 Supplier 인터페이스의 반환 타입이 Dictionary의 하위 타입인 경우를 염두에 둔 것으로 여겨집니다. 예를 들어, Supplier<DefaultDictionary> 타입의 변수가 있어 해당 변수를 SpellChecker 생성자의 매개변수로 넘기거나 혹은 일반적인 상황은 아닐 수 있겠지만 Supplier<DefaultDictionary> 등의 하위 타입 Supplier를 구현(혹은 Dictinary 인터페이스를 상속 받는 하위 타입 인터페이스의 Supplier를 구현. Supplier<SubDictionary> 같은)하는 클래스를 매개변수로 넘기는 상황 등에서는 한정적 와일드카드를 사용해야 하기 때문에 책에서 한정적 와일드카드를 사용하라고 얘기한 것 같습니다. 즉, Supplier<Dictionary> 타입이 아니라 Supplier<DefaultDictionary>, Supplier<SubDictonary> 타입과 같이 지네릭 타입에 Dictionary 하위 타입이 오더라도 사용 가능하게끔 하기 위함인 것 같습니다. 그렇게 생각한 근거는 책에"클라이언트는 자신이 명시한 타입(이 경우 Dictionary)의 하위 타입이라면 무엇이든 생성할 수 있는 팩터리를 남길 수 있다." - 30p라고 쓰여 있었기 때문입니다.