首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Guice中绑定Kotlin函数

如何在Guice中绑定Kotlin函数
EN

Stack Overflow用户
提问于 2018-01-21 20:49:19
回答 2查看 1.5K关注 0票数 4

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

代码语言:javascript
复制
class MyClass @Inject constructor(val work: (Int) -> Unit)) { ... }

bind@Provides都不起作用:

代码语言:javascript
复制
class FunctionModule : AbstractModule() {

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

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

我不断地发现错误:

kotlin.jvm.functions.Function1<没有实现吗?超级java.lang.Integer,kotlin.Unit>被捆绑。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-23 22:58:38

tl;dr -使用:

代码语言:javascript
复制
bind(object : TypeLiteral<Function1<Int, @JvmSuppressWildcards Unit>>() {})
    .toInstance({})

在班上

代码语言:javascript
复制
class MyClass @Inject constructor(val work: (Int) -> Unit)) { ... }

参数work具有以下类型(至少根据Guice):

代码语言:javascript
复制
kotlin.jvm.functions.Function1<? super java.lang.Integer, kotlin.Unit>

然而,

代码语言:javascript
复制
bind(object : TypeLiteral<Function1<Int, Unit>>() {}).toInstance({})

注册一种kotlin.jvm.functions.Function1<? super java.lang.Integer, **? extends** kotlin.Unit>类型

bind更改为bind(object : TypeLiteral<Function1<Int, **@JvmSuppressWildcards** Unit>>() {}).toInstance({})以消除返回类型上的差异,这样Guice就可以正确地注入函数。

票数 2
EN

Stack Overflow用户

发布于 2018-01-22 04:35:24

如果你要注入Function1<Int,Unit>而不是(Int) -> Unit怎么办?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48371583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档