아래의 글은 드미트리 제메로프, 스베트라나 이사코바 저/오현석역,『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

+ Recent posts