在Kotlin语言中,这个语法做什么?它是如何工作的?

class ClassName1 {
    companion object {          
        fun ClassName2.funName()=""         
    } 
}

推荐答案

这里有多种因素:

  • extension functions:它们允许使用函数,就像它是receiver类型(函数名称左侧的类型)的一部分一样
  • extension functions used as members:仅当封闭类(dispatch receiver)在范围内时,才能在其接收器(称为extension receiver)上使用的扩展函数
  • companion objects:与类关联的特殊object,只需使用类名即可引用

将成员扩展函数inside声明为伴随对象可能对不同的事情有用.

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

class ClassName1 {

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

    companion object {          
        fun ClassName2.funName() = ""         
    } 
}

不过,这种使用并不要求函数是公共的.

另一种使用方法是使用伴生对象作为一种作用域:

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

或者直接从companion导入函数:

import ClassName1.Companion.funName

val something = ClassName2()
something.funName()

例如,Duration.Compaion使用这种模式来定义数字类型的扩展(这些是扩展属性,但 idea 相同):

Kotlin相关问答推荐

在Kotlin Jetpack中重用下拉菜单

在Mapstruct中重用@映射定义

无法访问类kotlin.coroutines.CoroutineContext';.判断模块类路径中是否存在丢失或冲突的依赖项

collectAsState 未从存储库接收更改

为什么Kotlin有次构造函数和init块?

有没有什么方法或算法可以在没有存储的情况下生成唯一的随机数?

在 Kotlin 中,为什么在 `+` 之前但在 `.` 之前没有换行符?

为什么 Kotlin 在 sumOf 函数 lambda 中默认不将数字视为Int?

如何通过 compose 处理剪切区域?

如何从kotlin中的ArrayList中删除所有元素

如何在kotlin中使用协程每秒调用一个函数

Koin Android:org.koin.error.NoBeanDefFoundException

模拟异常 - 没有找到答案

如何从不同的功能发出流量值? Kotlin 协程

更新到版本4.10.1/4.10.2后 Gradle 同步失败

如果我可以将 Flow 和 StateFlow 与生命周期范围 \ viewLifecycleOwner.lifecycleScope 一起使用,那么在 ViewModel 中使用 LiveData 有什么意义

在java代码中使用kotlin库

大小写敏感性 Kotlin / ignoreCase

应用程序在使用 Google Play 服务时遇到问题

Kotlin reflect proguard SmallSortedMap