본문 바로가기

공부기록/JAVA

제네릭 변성

컴파일 시점에 컬렉션에 잘못된 값이 들어가는 것을 예방해준다.

 

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를 사용하라

 

 

출처