【问题标题】:Guice TypeLiterals in KotlinGuice 类型 Kotlin 中的字面量
【发布时间】:2018-03-13 16:33:03
【问题描述】:

我有一个场景,我有一个通用接口,并希望在 Guice 中绑定该接口的多个实现。通常在 Java 中这意味着 TypeLiterals,在 Kotlin 中如何实现?

bind(TypeLiteral<Resolver<RealObject>>(){}).to(RealResolver::class.java)

这会产生以下编译器错误: cannot access &lt;init&gt;: it is public/*package*/ in 'TypeLiteral'

有一个 TypeLiteral.get() 方法,但我似乎也无法让它工作

【问题讨论】:

    标签: generics dependency-injection kotlin guice


    【解决方案1】:

    您应该使用 Kotlin object expression,而不是 Java 匿名类语法 (new TypeLiteral&lt;Resolver&lt;RealObject&gt;&gt;(){}):

    bind(object : TypeLiteral<Resolver<RealObject>>() { }).to(RealResolver::class.java)
    

    您可以将其包装到带有具体类型参数的内联函数中:

    inline fun <reified T> typeLiteral() = object : TypeLiteral<T>() { }
    

    然后将其用作:

    bind(typeLiteral<Resolver<RealObject>>()).to(RealResolver::class.java)
    

    【讨论】:

    • 我只是想补充一点,它按照上面的方式编译——但是记得在注入点和声明上添加@JvmSuppressWildcards 例如bind(object : TypeLiteral&lt;Resolver&lt;@JvmSuppressWildcards RealObject&gt;&gt;() { }).to..... 然后实现class InjectionTest @Inject constructor(resolver: Resolver&lt;@JvmSuppressWildcards RealObject&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多