首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用Guice模块

通用Guice模块
EN

Stack Overflow用户
提问于 2021-08-05 07:09:49
回答 1查看 239关注 0票数 0

有可能定义一个通用的Guice吗?

我总是得到一个CreationException

代码语言:javascript
复制
Exception in thread "main" com.google.inject.CreationException: Unable to create injector, see the following errors:

1) com.example.test.GenericClass<T> cannot be used as a key; It is not fully specified.

1 error
    at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:470)
    at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:155)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107)
    at com.google.inject.Guice.createInjector(Guice.java:99)
    at com.google.inject.Guice.createInjector(Guice.java:73)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at com.example.test.GenericModuleKt.main(genericModule.kt:23)
    at com.example.test.GenericModuleKt.main(genericModule.kt)

这是我的示例代码:

代码语言:javascript
复制
package com.example.test

import com.google.inject.AbstractModule
import com.google.inject.Guice
import com.google.inject.Key
import com.google.inject.TypeLiteral

class SomeClass

class GenericClass<T>

class GenericModule<T> : AbstractModule() {
    override fun configure() {
        bind(object : TypeLiteral<GenericClass<T>>(){})
    }
}

fun main() {
    val injector = Guice.createInjector(
        GenericModule<SomeClass>()
    )

    val instance : GenericClass<SomeClass> =
        injector.getInstance(object : Key<GenericClass<SomeClass>>(){})
}

编辑: Yurii Melnychuk的帮助下的工作示例

您需要使用Types.newParameterizedType来指定泛型类:

代码语言:javascript
复制
class SomeClass

class GenericClass<T>

class GenericModule(
    private val genericClass: Class<*>
) : AbstractModule() {
    override fun configure() {
        val paraType = Types.newParameterizedType(GenericClass::class.java, genericClass)
        bind(TypeLiteral.get(paraType))
    }
}

fun main() {
    val injector = Guice.createInjector(
        GenericModule(SomeClass::class.java)
    )

    val instance : GenericClass<SomeClass> =
        injector.getInstance(object : Key<GenericClass<SomeClass>>(){})
}

如果遇到任何问题(特别是在使用通用接口时),请尝试使用而不是Kotlin。这为我解决了一些问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-05 07:56:30

泛型类型信息在运行时被删除,因此不可能以您想要的方式完成它(至少在Java中,Kotlin在这方面可能有所不同,但我不熟悉它,可能具体化泛型会有所帮助)。

但是从Java的角度来看,我宁愿将TypeLiteral/Type作为构造函数参数传递给模块并绑定它(com.google.inject.util.Types#newParameterizedType应该会有所帮助)。

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

https://stackoverflow.com/questions/68662070

复制
相关文章

相似问题

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