// 这是我们如何给扩展函数限制可见性的
class PhoneBookCorrect {
// ...
}
private fun String.isPhoneNumber() =
length == 7 && all { it.isDigit() }
我们倾向避免扩展成员有几个很好的理由:
这样做不支持引用:
val ref = String::isPhoneNumber
val str = "1234567890"
val boundedRef = str::isPhoneNumber
val refX = PhoneBookIncorrect::isPhoneNumber // ERROR
val book = PhoneBookIncorrect()
val boundedRefX = book::isPhoneNumber // ERROR
对有两个接收者的隐式访问可能会令人困惑:
class A {
val a = 10
}
class B {
val a = 20
val b = 30
fun A.test() = a + b // 它是40还是50?
}
当我们期望一个扩展去修改或引用一个接收者时,我们不清楚这个扩展函数作用在哪个接收者上:
class A {
//...
}
class B {
//...
fun A.update() = ... // 这个 update 函数是针对A的,还是针对B的???
}