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

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

타입 파라미터의 섀도잉을 피하라 #

interface Tree
class Birch: Tree
class Spruce: Tree

class Forest<T: Tree> {

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

ForestaddTree의 타입 파라미터는 독립적이다. (관계가 없다.)

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

(아마도 대부분의 경우) 위 코드는 개발자가 의도한 것이 아닐 것이다. 따라서 오류가 발생한다는 것을 알아차리기 쉽지 않다.


[수정 1] 다음과 같이 작성하는 것이 올바를 것이다.

class Forest<T: Tree> {
    fun addTree(tree: T) { // 클래스의 타입 파라미터를 사용하도록 수정한다.
        // ...
    }
}

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

[수정 2] 만약 독립적인 타입 파라미터를 의도한 것이라면 ‘이름’을 다르게 짓는 것이 좋았을 것이다.

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

    }
}

요약 #

타입 파라미터의 섀도잉을 피하자.