이펙티브 코틀린 아이템 23: 타입 파라미터의 섀도잉을 피하라

이펙티브 코틀린(재사용성)

아이템 23: 타입 파라미터의 섀도잉을 피하라

1
2
3
4
5
6
7
8

class Forest(val name: String){

fun addTree(name: String){
//....
}
}

지역 파라미터가 외부 스코프에 있는 프로퍼티를 가린다. 이를 새도잉이라고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

interface Tree

class Birch: Tree
class Spruce: Tree

class Forest<T: Tree> {
fun <T: Tree> addTree(tree: T){
//....
}
}


val forest = Forest<Birch>()
forest.addTree(Birch())
forest.addTree(Spruce())

위와 같이 선언하면 타입 파라미터가 새도잉된다.

하지만 위처럼 독립적으로 동작합니다.

1
2
3
4
5
6
7
8
9
class Forest<T: Tree> {
fun addTree(tree: T){
//....
}
}

val forest = Forest<Birch>()
forest.addTree(Birch())
forest.addTree(Spruce()) // Error

위처럼 선언해야 의도한 방식대로 동작할것입니다.

1
2
3
4
5
class Forest<T: Tree> {
fun <ST: T> addTree(tree: ST){
//....
}
}

독립적으로 선언하고 싶으면 이름을 아에 다르게 선언하는것이 좋다.

참조