공부기록/JAVA
제네릭 변성
DGL
2021. 12. 8. 18:15
컴파일 시점에 컬렉션에 잘못된 값이 들어가는 것을 예방해준다.
A가 B의 상위 타입일 때,
GenericType<A>가 GenericType<B>의 상위 타입이 아니면,
변성 없음(invariant- 무변성, 무공변)
(즉 캐스팅이 안됨)
무변성일 때, 당연히 되야할 것 같은 것이 안되는 문제가 있음
GenericType<T extends A> 로 하면... → 이게 해결됨( extends로 공변처리)
GenericType<? extends A> gen = new GenericType<B>;
인 경우에는 gen.push(new B()); (에러가 발생)
→ B보다 더 하위의 클래스일 수도 있기 때문
반공변(contravariant)
A가 B의 상위타입이고, T<A>가 T<B>의 하위 타입이면 반공변
- super를 사용해서 반공변 처리 가능
GenericType<? super B> genn = new GenericType<B>();
genn.push(new B()); // 가능, ctt는 최소 GenericType<B>거나 그 상위 타입..
→ 적어도 B보다 같거나 그것보다 상위에 위치한 타입을 사용한다!!
그래서 온전하게 B타입의 리스트를 넣을 수 있다.
이펙티브 자바 - PECS
producer-extends, consumer-super
값을 제공하면 extends를 쓰고
값을 사용하면 super를 사용하라
출처
- 내 머리(일부)
- 최범균 유튜브 - 지네릭 변성(대부분) https://youtu.be/PtM44sO-A6g