为什么Guice找不到我的List <interface>绑定?

时间:2017-02-20 20:08:21

标签: dependency-injection guice kotlin

我有一个带有几个实现的接口:

windows

哪些都绑定在我的interface PuNoManager { fun notifyUser(userId: Int) } class FcmManager @Inject constructor(val fcmClient: FcmClient) : PuNoManager { override fun notifyUser(userId: Int) { ... } } class ApnsManager @Inject constructor(val apnsClient: ApnsClient) : PuNoManager { override fun notifyUser(userId: Int) { ... } } 中,以及Module - 带注释的方法来获取@Provides

List<PuNoManager>

当我有一个需要class PuNoModule: AbstractModule() { override fun configure() { bind(ApnsManager::class.java) bind(FcmManager::class.java) } @Provides fun puNoManagers(apnsManager: ApnsManager, fcmManager: FcmManager): List<PuNoManager> { return listOf(apnsManager, fcmManager) } } 的类时出现问题 - Guice抱怨该类型尚未绑定:

List<PuNoManager>

我知道我的Guice设置正常,因为我之前只有Explicit bindings are required and java.util.List<? extends ...PuNoManager> is not explicitly bound. while locating java.util.List<? extends ...PuNoManager> 并且正在添加第二个ApnsManagerPuNoManager。问题源于依赖类请求注入FcmManager而不仅仅是List<PuNoManager>

2 个答案:

答案 0 :(得分:1)

Kotlin中的

List<X>在JVM上被翻译为java.util.List<? extends X>。显然,Guice并不支持注入这些值。要避免使用通配符,您可以改用MutableList<X>,转换为java.util.List<X>

答案 1 :(得分:0)

尝试将@JvmSuppressWildcards添加到模块类中。