속성과 파라미터를 같은 이름으로 설정하는 것은 가능합니다.
지역 매개변수가 외부 스콥의 속성을 따라 갈때, 실제로 경고가 생기지 않습니다. 왜냐하면 이런 경우는 일반적이기 때문입니다.
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) {
// ...
}
}
정리
쉐도우 매개변수들의 경우 주의해서 사용해야합니다.