아래의 글은 드미트리 제메로프, 스베트라나 이사코바 저/오현석역,『Kotlin in Action』,에이콘출판사(2017)의 내용을 기반으로 작성하였습니다.
기저 타입 : base type : LIst<String>에서 List를 base type 이라 부르고, String 은 타입 파라메터라고 부름.
LSP : Liskov Substitution Principle : A가 B의 상위 타입이라면, A 타임의 인스턴스에 대해 성립하는 모든 규칙은 B타입의 인스턴스에 대해서도 성립해야한다.
declaration-site variance : 선언 지점 변성
use-site variance : 사용 지점 변성
코틀린은 타입인자도 추론 가능, 코틀린은 타입인자가 없는 제네릭 지원안함. (자바는 하위호환성때문에 List aaa = .. 이 가능 )
제네릭 타입 인자는 컴파일 시점에만 존재
코틀린 Mutable<out T>는 자바 MutableList<? extends T> 와 같고
코틀린 Mutable<in T>는 자바 MutableList<? super T>와 같다.
PECS ( Procuder Extends Consumer Super)
MutableList<*>는 MutableList<Any?> 와 같지 않다. (MutableList<T>가 T에 대해서 무공변성)
자바 Function <? super T, ? extends R> 처럼 와일드 카드 사용\\
코틀린
interface Function1<in P, out R> {
operator fun invoke(p: P) : R
}
(P) -> R : Function1<P, R>
첫번째 타입 파라미터, 반공변, 두번째 타입 파라미터, 공변적
covariance | invariance | contravariance |
공변 | 무공변 | 반공변 |
하위타입관계 허용 | 타입인자로 서로 다른 타입이 들어가면 인스턴스 타입사dl의 하위관계가 허용 안함 | 타입 인자의 하위 타입 관계가 뒤집힌다. |
out | in | |
Procuder<Cat>은 Producer<Animal>의 하위 타입 | Cunsumer<Animal>은 Consumer<Cat>의 하위타입 | |
interface Producer<out T> { fun produce() : T } |
object Validators {
private val validators = mutableMapOf(KClass<*>, FieldValidator<*>>()
fun <T: Any> registerValidator (
kClass: KClass<T>, fieldValidator: FieldValidator<T>) {
validators[kClass] = fieldValidator
}
@Supress("UNCHCKED_CAST")
operator fun <T: Any> get<kClass: KClass<T>): FieldValidator<T> =
validators[kClass] as? FieldValidator<T>
?: throws IllegalArgumentException ("No validator for ${kClass.simpleName}")
}
스타 프로젝션: 타입 대신 * 사용
제네릭 클래스의 타입 인자가 어떤 타입인지 정보가 없거나 타입 인자가 어떤 타입인지가 중요하지 않을 때 사용
제네릭스와 변성, 공변은 자바에서 가장 어려운 부분중 하나이니 조급하게 생각하지 말고 완전히 이해가기 보다는 익숙해지도록 해라.
'독서관련 > Kotlin in Action' 카테고리의 다른 글
CH10 리플렉션 (0) | 2021.02.13 |
---|---|
CH10 어노테이션 (0) | 2021.02.13 |
CH08 코틀린 고차함수 (0) | 2021.01.28 |
CH07 코틀린 연산자 오버로딩 (0) | 2021.01.27 |
CH06 코틀린 컬렉션 및 배열 (0) | 2021.01.17 |