prgrms-web-devcourse / BE-Team-preArmand-Book-study

2 stars 2 forks source link

[아이템 26] 와일드카드 타입 #11

Closed epicblues closed 2 years ago

epicblues commented 2 years ago

page 159 핵심 정리

빠르게 훑어보자면, Set<Object>는 어떤 타입의 객체도 저장할 수 있는 매개변수화 타입이고, 
Set<?>는 모종의 타입 객체만 저장할 수 있는 와일드카드 타입이다.
kimziou77 commented 2 years ago

T : read/write 모두 가능 ? extends T : read만 가능한 서브타입 와일드카드 ? super T : write만 가능한 슈퍼 타입 와일드카드


? 만 사용시 ? extends Object와 동일합니다. 따라서 wrtie가 안되고 read만 가능합니다.(Object write도 제한됨)

List<? extends Object> 라고 하더라도, 인자로 들어오는 애들은 List\<String> List\<Integer> 이렇게 Object를 상속하는 타입이 고정된 상태로 오게됩니다 하지만 컴파일 시점에는 아직 뭐가올지 모르는 상태이기 때문에 메서드 안에서 add와 같은 행위를 할수 없습니다

List\<String>이 인자로 들어왔는데 Integer같은 애들을 넣는 로직이 있으면 위험하기 때문입니다. \<String>로 고정된 List는 String 타입만이 오도록 강제되어 있으므로 Object에 대한 add또한 안됩니다.

따라서 말씀하신 예제의 Collection\<?>에 대해서는 내부 아이템에 대해 Read만 가능하고 Write는 불가능합니다. null은 타입과 무관하기 때문에 예외가 아닐까 생각합니다..!

kimziou77 commented 2 years ago

써보고 보니 알고계신 내용을 작성한듯 하네요 ㅋㅋㅋ.. ㅎ 덕분에 제가 공부하고 갑니다.. 😆

epicblues commented 2 years ago

@kimziou77

헐 저 전혀 몰랐습니다 !! 그냥 아무 생각 없이 extends에서는 안되는 게 super에서는 되는구나 정도로 생각했었는데 그게 read와 write 개념이었군요 처음 알았습니다...🤣🤣 감사합니다!!

null은 어떤 타입 매개변수가 와도 오류 없이 적용될 수 있으니까 되는 것이 아닐까 생각이 드네요...!

Leeyerimearth commented 2 years ago

헛 저도 이부분이 무슨말인가 했는데, @kimziou77 님 글보고 이해가 되었네요.

Collection<?>에는 null을 제외한 어떤 객체도 저장할 수 없는 것

이 말뜻이 정말 write를 못한다는 뜻이었네요. 처음 저장(?) 설정한 타입 외의 타입은 저장할 수 없다라고 이해했었네요 ;; 감사합니다 !