对Kotlin来说是新手,想知道是否可以动态分配 同伴对象的变量的函数.阅读这里的文档和一些答案,但没有提到这一点.

class Printer {
    companion object {
        fun printAnything() {
            println("printing anything..")
        }
    }
}

fun printA() {
    println("printing A!")
}

fun main(args: Array<String>) {
    printA()
    Printer.printAnything = :: printA // doesn't compile, perhaps a different way?
}

推荐答案

不能重新分配用fun声明的函数.它将始终指向相同的函数.但您可以创建一个var,它包含对函数的引用.持有函数的varval属性可以作为函数调用,就像它是一个fun声明一样.

fun defaultPrintAnything() {
    println("printing anything...")
}

var printAnything = ::defaultPrintAnything

fun printA() {
    println("printing A!")
}

fun main() {
    printAnything() // calls defaultPrintAnything
    printAnything = ::printA
    printAnything() // calls printA
}

您可以在您喜欢的任何地方创建这样的变量,无论它是否在伴随对象中.所以,是的,你可以用这种方式制作你的Printer个同伴物品:

class Printer {
    companion object {
        var printAnything = {
            println("printing anything..")
        }
    }
}

Kotlin相关问答推荐

Kotlin协程挂起继续线程

Kotlin多平台(KMP)保存到文件不能在iOS上保存

为什么不';Kotlin是否在数据类构造函数中隐式分配null值可为null的字段?

Kotlin 如何使用其 get 函数在内部检索映射值

在 Compose 中使用 Text() 时如何获取文本的大小?

使用 Compose for Desktop Bundle 文件

如何限制 Kotlin 中的枚举?

使用 Discord4j 交叉发布 Discord 消息

为什么 KFunction2 在 Kotlin 中不是可表示类型?

Mixin 在 Jackson 中添加 defaultImpl 不起作用

为什么没有remember 的 mutableStateOf 有时会起作用?

AIDL 中的 Parcelize 注释:Incompatible types: Object cannot be converted to MyCustomObject

@InlineOnly 注释是什么意思?

在 Spring Framework 5.1 中注册具有相同名称的测试 bean

如何将 kotlin 集合作为 varagrs 传递?

Kotlin协程处理错误和实现

如何在Kotlin中获得KType?

无法解决:androidx.lifecycle:lifecycle-extensions-ktx:2.0.0-alpha1

判断EditText是否为空kotlin android

Kotlin 中的限制函数