glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-006] 제네릭의 불공변 특성에 대한 설명 #130

Closed yngbao97 closed 4 months ago

yngbao97 commented 5 months ago

Based on: #129 by @ssh2957


로타입과 제네릭 타입의 간단한 사용예시를 통해 로타입이 왜 위험한지, 로타입이 주는 이점을 제네릭에서 어떻게 구현할 수 있는지 잘 정리해주셔서 감사합니다.

이번 주차에 저는 공변/불공변, 실체화/비실체화에 대한 개념에 대해 공부했었는데요. 따라서 다음 부분에 설명을 추가드릴 수 있을 것 같습니다.

List와 List를 보면 Object가 String의 부모이기 때문에 가능할것 같지만 List가 List의 부모는 아니기 때문에 오류가 발생하는것이다

배열은 공변이며, 제네릭은 불공변의 성격을 가집니다.

공변: a가 A의 하위 타입이면, a[]는 A[]의 하위타입이다. 불공변: a가 A의 하위 타입이더라도, List는 List와 아무런 관련이 없다.

List가 List의 부모가 아니라는 설명도 큰 의미에서 보면 잘못된 설명은 아니지만, 배열의 경우 공변의 성격을 갖기 때문에 A[]에 a[] 배열을 바로 대입할 수 있지만 제네릭을 사용하는 자료구조의 경우 불공변의 성격을 갖기 때문에 List 타입 매개변수에 List 타입 변수를 넣을 수 없다고 설명하는 것이 좋을 것 같아 글 남깁니다!

좋은 탐구 감사합니다! 고생하셨습니다👍🏻

ssh2957 commented 5 months ago

불공변과 공변에 관한 yngbao97글 덕분에 이해도가 더욱더 상승했습니다 감사합니다.