Page 25 -
P. 25
에만 적용할 수 있기 때문에 트리 원소가 Number 타입(또는 그 하위 타입)의 값이길 바란다. 이런
특성을 표현하기 위해 타입 파라미터의 상위 바운드(upper bound)로 Number를 선언할 수 있다.
fun <T : Number>TreeNode<T>.average(): Double {
var count = 0
var sum = 0.0
walkDepthFirst { // 깊이 우선으로 노드를 방문하면서 함수 수행
count++
sum += it.toDouble()
}
return sum/count
}
타입 파라미터에 상위 바운드가 있으면, 컴파일러는 이 타입 파라미터에 공급된 타입 인자의 타입 9
이 상위 바운드의 하위 타입인지 검사한다. 디폴트 상위 바운드는 Any?로 간주되므로 이를 명시할 제네릭스
필요는 없고, 이런 경우 이 타입 파라미터는 모든 코틀린 타입을 타입 인자로 받을 수 있다. Int와
Double이 Number의 하위 타입이기 때문에 다음 코드는 올바른 코드다.
val intTree = TreeNode(1).apply {
addChild(2).addChild(3)
addChild(4).addChild(5)
}
println(intTree.average()) // 3.0
val doubleTree = TreeNode(1.0).apply {
addChild(2.0)
addChild(3.0)
}
println(doubleTree.average()) // 2.0
average()를 문자열 트리에 대해 호출하면 컴파일 오류가 발생한다.
val stringTree = TreeNode("Hello").apply {
addChildren("World", "!!!")
}
// error: unresolved reference. None of the following candidates is applicable because
of receiver type mismatch
println(stringTree.average())
final 클래스를 상위 바운드로 사용하면 한 가지 타입만 지정할 수 있기 때문에 이런 바운드는 쓸
모가 없다. 따라서 이런 경우 컴파일러가 경고를 표시한다.
365
Kotlin_05.indd 365 2022-02-15 오후 4:08:04