독서

[코틀린 인 액션] 9장. 제네릭스

오렌지색 귤 2024. 5. 19. 22:45
반응형

찾아본 내용

 

1. 하위 타입에 대한 두가지 규칙

 

1. 하위 타입은 상위 타입이 선언하는 것과 최소한 동일한 범위의 타입을 수용해야한다. (in)
2. 하위 타입은 상위 타입이 선언하는 것과 최대한 동일한 범위의 타입을 반환해야한다. (out)

 

2. 공변성

 

1. 하위 타입(Dog)은 상위 타입(Animal)보다 구체적이므로 최소한 동일한 범위의 타입을 수용할 수 없다.
2. 하위 타입(Dog)은 상위 타입(Animal)보다 구체적이므로 최대한 동일한 범위의 타입을 반환할 수 있다.

따라서 하위 타입에 대해 공변성을 만족하려면 out 에 대해서만 정의 가능

 

3. 반공변성

 

1. 하위 타입(Animal)은 상위 타입(Dog)보다 추상적이므로 최소한 동일한 범위의 타입을 수용할 수 있다.
2. 하위 타입(Animal)은 상위 타입(Dog)보다 추상적이므로 최대한 동일한 범위의 타입을 반환할 수 없다.

따라서 하위 타입에 대해 반공변성을 만족하려면 in 에 대해서만 정의 가능

 

4. 해결 방법

 

1. interface 분리하여 두가지 모두 implement
2. in, out 이용한 선언 지점 변성

2번 가능한 이유 = 타입 프로젝션
- out projection : in type parameter가 Nothing이 되어 하위 타입이 더 추상적이게 된다
- in projection : out type parameter가 Any?가 되어 하위 타입이 더 구체적이게 된다

 

 

참고

 

 

The Ins and Outs of Generic Variance in Kotlin

The ultimate guide to understanding generics, covariance, contravariance, and type projections in Kotlin. Learn two simple subtyping rules that explain why generic variance works the way that it does.

typealias.com

 

반응형