Page 27 -
P. 27
U가 T의 하위 타입이므로 위 함수는 트리 원소의 타입보다 더 일반적인 타입의 리스트를 인자로
받을 수 있다. 예를 들어, Int 트리나 Double 트리에 있는 원소들을 (이 두 타입의 공통 상위 타입
인) Number 타입의 리스트에 추가할 수 있다.
fun main() {
val list = ArrayList<Number>()
TreeNode(1).apply {
addChild(2)
addChild(3)
}.toList(list)
TreeNode(1.0).apply { 9
addChild(2.0)
addChild(3.0) 제네릭스
}.toList(list)
}
자바 vs. 코틀린 코틀린 타입 파라미터의 상위 바운드는 자바의 상위 바운드와 비슷하다. 표현하는
방식이 자바에서는 T extends Number이지만 코틀린에서는 T: Number라는 점이 다르다.
아주 흔한 경우로 타입 파라미터를 널이 아닌 타입으로 제한하는 경우가 있다. 이를 위해서는 상
위 바운드로 널이 될 수 없는 타입을 지정해야 한다.
fun <T: Any> notNullTreeOf(data: T) = TreeNode(data)
타입 파라미터 구문을 사용하면 상위 바운드를 하나만 지정할 수 있다. 하지만 한 타입 파라미터
에 여러 제약을 가할 필요가 있을 때도 있다. 이럴 때는 좀 더 복잡한 타입 제약 구문을 통해 타입
을 제한할 수 있다. 예를 들어 다음과 같은 인터페이스가 있다고 하자.
interface Named {
val name: String
}
interface Identified {
val id: Int
}
이름과 식별자가 모두 있는 객체 레지스트리를 정의하고 싶다고 가정하자.
367
Kotlin_05.indd 367 2022-02-15 오후 4:08:04