본문 바로가기

카테고리 없음

Effective Kotlin - Avoid shadowing type parameters

속성과 파라미터를 같은 이름으로 설정하는 것은 가능합니다.

지역 매개변수가 외부 스콥의 속성을 따라 갈때, 실제로 경고가 생기지 않습니다. 왜냐하면 이런 경우는 일반적이기 때문입니다.

class Forest(val name: String) {
    fun addTree(name: String){
        // ...
    }
}

주의해서 사용해야할 부분입니다.

** 아래의 코드에서 Forest 의 T 와, addTree 의 T 는 서로 독립된 상태입니다.

interface Tree
class Birch: Tree
class Spruce: Tree

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

그렇다면 아래의 코드는 어떨까요?

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

// usage
val forest = Forest<Birch>()
forest.addTree(Birch())
forest.addTree(Spruce()) // ERROR, type mismatch

에러가 발생하게됩니다. 클래스의 generic type 을 가져다 쓰기 때문인데요.
이 경우, 다음처럼 보다 명확하게 코드를 수정하여 사용가능합니다.

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

정리

쉐도우 매개변수들의 경우 주의해서 사용해야합니다.