如何在Guice中绑定Kotlin函数

我有一个类似于此的Kotlin类:

class MyClass @Inject constructor(val work: (Int) -> Unit)) { ... }

绑定和@Provides都不起作用:

class FunctionModule : AbstractModule() {

    override fun configure() {
        bind(object : TypeLiteral<Function1<Int, Unit>>() {}).toInstance({})
    }

    @Provides
    fun workFunction(): (Int) -> Unit = { Unit }
    }
}

我一直收到错误:

No implementation for kotlin.jvm.functions.Function1< ? super java.lang.Integer, kotlin.Unit> was bound.

如何使用Guice为Kotlin函数注入实现?

最佳答案 tl; dr – 使用:

bind(object : TypeLiteral<Function1<Int, @JvmSuppressWildcards Unit>>() {})
    .toInstance({})

在课堂里

class MyClass @Inject constructor(val work: (Int) -> Unit)) { ... }

参数work有一个类型(至少根据Guice):

kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>

然而,

bind(object : TypeLiteral<Function1<Int, Unit>>() {}).toInstance({})

注册一种类型的kotlin.jvm.functions.Function1<?超级java.lang.Integer,**?扩展** kotlin.Unit>

将bind更改为bind(object:TypeLiteral< Function1< Int,** @ JvmSuppressWildcards ** Unit>>(){}).toInstance({})
删除返回类型的方差允许Guice正确地注入函数.

点赞