class Forest(val name: String) {
fun addTree(name: String){ }
}
- 위의 코드 처럼 프로퍼티와 파라미터가 같은 이름을 가질 수 있다.
- 이렇게 되면 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가림. 이를 섀도잉 이라 부른다.
섀도잉 현상은 클래스 타입 파라미터와 함수 타입 파라미터 사이에서도 발생
interface Tree
class Birch: Tree
class Spruce: Tree
class Forest<T: Tree> {
fun <T: Tree> addTree(tree: T) {
println("adding tree ...")
}
}
fun main() {
val forest = Forest<Birch>()
forest.addTree(Birch())
forest.addTree(Spruce()) //정상동작...
}
-----------------------------------------
class Forest<T: Tree> {
fun addTree(tree: T) {
println("adding tree ...")
}
}
fun main() {
val forest = Forest<Birch>()
forest.addTree(Birch())
forest.addTree(Spruce()) // error
}
만약 독릭적인 타입 파라미터를 의도했다면, 타입 파라미터의 이름을 다르게 하는 것이 좋다.
class Forest<T: Tree> {
fun <ST: Tree> addTree(tree: ST) {
println("adding tree ...")
}
// 다른 타입 파라미터에 제한을 준 경우
fun <ST: T> addTypeTree(tree: ST) {
println("adding tree ...")
}
}
'Reading Record > 이펙티브 코틀린' 카테고리의 다른 글
[이펙티브 코틀린] Item25. 공통 모듈을 추출해서 여러 플랫폼에서 재사용하라 (0) | 2022.05.02 |
---|---|
[이펙티브 코틀린] Item24. 제네릭 타입과 variance 한정자를 활용하라 (0) | 2022.05.02 |
[이펙티브 코틀린] Item22. 일반적인 알고리즘을 구현할 때 제네릭을 사용하라 (0) | 2022.05.01 |
[이펙티브 코틀린] Item21. 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 (0) | 2022.05.01 |
[이펙티브 코틀린] Item20. 일반적인 알고리즘을 반복해서 구현하지 말라 (0) | 2022.05.01 |