Kotlin:伴生对象内的函数扩展

Ima*_*ane 5 kotlin companion-object extension-function

在 Kotlin 语言中,这个语法有什么作用以及如何工作?

class ClassName1 {
    companion object {          
        fun ClassName2.funName()=""         
    } 
}
Run Code Online (Sandbox Code Playgroud)

Jof*_*rey 7

这里有很多事情在起作用:

  • 扩展函数:它们允许使用该函数,就好像它是接收者类型的一部分(函数名称左侧的类型)
  • 用作成员的扩展函数:仅当封闭类(调度接收器)在范围内时,才可以在其接收器(称为扩展接收器)上使用扩展函数
  • 伴生对象object:与类关联的特殊对象,只需使用类名即可引用

在伴生对象内声明成员扩展函数可能对不同的事情有用。

例如,此类函数可以在类内使用,就好像扩展函数被声明为类成员但在伴生函数之外一样。有些人喜欢将它们放在伴生对象中,以明确它们不依赖于所述类的状态(如 Java 静态函数):

class ClassName1 {

    fun method(): String {
        val something = ClassName2()
        return something.funName()
    }

    companion object {          
        fun ClassName2.funName() = ""         
    } 
}
Run Code Online (Sandbox Code Playgroud)

不过,这种使用并不要求该函数是公开的。

使用它的另一种方法是将伴生对象用作某种范围:

val something = ClassName2()
with(ClassName1) { // this: ClassName1.Companion
   something.funName() // brought in scope by ClassName1's companion
}
Run Code Online (Sandbox Code Playgroud)

或者直接从同伴导入函数:

import ClassName1.Companion.funName

val something = ClassName2()
something.funName()
Run Code Online (Sandbox Code Playgroud)

例如,这种模式用于Duration.Compaion定义数字类型的扩展(这些是扩展属性,但它是相同的想法): https://github.com/JetBrains/kotlin/blob/6a670dc5f38fc73eb01d754d8f7c158ae0176ceb/libraries/stdlib/src/kotlin/time /持续时间.kt#L71