타입 파라미터의 섀도잉을 피하라 #
interface Tree
class Birch: Tree
class Spruce: Tree
class Forest<T: Tree> {
fun <T: Tree> addTree(tree: T) {
// ...
}
}
Forest
와 addTree
의 타입 파라미터는 독립적이다. (관계가 없다.)
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) {
}
}
요약 #
타입 파라미터의 섀도잉을 피하자.