【发布时间】:2019-10-15 04:49:53
【问题描述】:
在 Kotlin 中,如果我在伴生对象中有一个以 Companion. 为前缀的函数 (Companion.foo),与伴生对象内的 foo 相比会有什么不同?
我注意到在下面的代码中,Companion.foo 将使它对外部范围不可见,但对同一伴随对象内的函数仍然可见。
您可以在以下位置找到代码 sn-p:https://pl.kotl.in/t6FvM6ni6
fun main() {
A.foo() // compiler complains "unresolved reference"
A.bar()
B.foo()
}
class A {
companion object {
fun Companion.foo() {
println("hello in A")
}
fun bar() {
foo()
}
}
}
class B {
companion object {
fun foo() {
println("hello in B")
}
}
}
还有其他区别吗?除了可见性之外,A.Companion.foo 和 A.foo 是否相同?这是一种将方法封装在伴生对象中的方法吗?
更新 1
在我的实际项目中,我从伴随对象中的另一个inline 函数调用inline 函数,这就是不能使用访问修饰符的原因。但如果可能的话,我仍然想隐藏foo。
class C {
companion object {
inline fun <reified T> Companion.foo() {
println("hello in A")
}
inline fun bar() {
foo<String>()
}
}
}
【问题讨论】: