Kotlin Generic #2
들어가면서
Kotlin을 공부하면서 새로 알게되는 부분을 정리합니다.
Kotlin의 In, out 구문은 Java에 있는 와일드 카드 타입과 대응된다.
List<Integer> ints = List.of(1,2,3)
List<? extend Number> nums = ints
특정 지점에 변성을 주는 방식은 유용하다.
<out T> = <? extends T>
<in T> = <? super T>
제네릭 클래스 자체를 공변하게 만드는 방법
변성을 주는 위치 2가지
- declaration site variance
class Cage3<out T>{ ... }
- use site variance
fun moveFrom(cage: Cage2<out T>){ this.animals.addAll(cage.animals); }
in 선언지점 변성 활용 예시
- Comparable
out 선언지점 변성 활용 예시
- List @UnsafeVarianace -> 타입이 안전하다고 생각하는 경우에 넣음 개발자가 안전함을 보장할 수 있어야됨
제네릭 제약과 제네릭 함수
타입 파라미터에 제한 조건을 주는 법 = 제네릭 제약
class Cage5<T: Animal>{
}
제한 조건을 여러개 두고 싶다면?
class Cage5<T>(
private val animals: MutableList<T> = mutableListOf()
) where T: Animal, T: Comparable<T>{
fun printAfterSorting(){
this.animals.sorted()
.map { it.name }
.let { println(it) }
}
}
이런 경우 동물들을 정렬하는 함수를 만들수 있음