无法引用随播对象方法

net*_*men 10 kotlin

我有以下代码:

fun process(call: () -> Int) {
}

fun aa() = 5

class A {
    companion object Factory {
        fun bb() = 6
    }
}

fun test() {
    process(::aa)   // OK
    process(::A.bb) // Overload resolution ambiguity
}
Run Code Online (Sandbox Code Playgroud)

当我尝试呼叫时,process(::A.bb)我收到以下错误:

Error:Overload resolution ambiguity:
public constructor A() defined in ru.netimen.hitch_hikingstats.A
public companion object Factory defined in ru.netimen.hitch_hikingstats.A
Run Code Online (Sandbox Code Playgroud)

有没有办法引用伴侣对象方法?

are*_*lek 5

您可以使用process(A.Factory::bb)process((A)::bb)现在。

提出此问题后不久,Kotlin 1.1发行了,它支持绑定的可调用引用:

Kotlin 1.1.2带有针对KT-15951的修复程序,这意味着从那时起您可以致电process(A.Factory::bb)

也有针对Kotlin 1.4的KT-13934process(A::bb),尽管您的A定义为:

class A {
    fun bb() = 5
    companion object Factory {
        fun bb() = 6
    }
}
Run Code Online (Sandbox Code Playgroud)

您必须记住,它将5像现在一样使用返回的函数。


Mic*_*ael 4

从语法上讲是可以的,A.Factory:bb但行不通。起初,需要bb一段A.Factory.() -> Int时间。() -> Int

其次,正如 Kotlin 编译器所说,目前不支持对对象成员的可调用引用。以下是所有可调用成员任务的父任务:https://youtrack.jetbrains.com/issue/KT-1183

  • 不,它们实际上不是静态的。相应伴生类的实例中的伴生对象及其方法是实例方法。如果要将伴生对象的方法设为静态,则需要在该方法上添加 @JvmStatic 注解。 (2认同)