为什么 Guice 找不到我的 List<Interface> 绑定?
Why isn't Guice finding my List<Interface> binding?
我有一个带有几个实现的接口:
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)
}
}
当我有一个需要 List<PuNoManager>
的 class 时,问题就出现了——Guice 抱怨类型没有被绑定:
Explicit bindings are required and java.util.List<? extends ...PuNoManager> is not explicitly bound.
while locating java.util.List<? extends ...PuNoManager>
我知道我的 Guice 设置正在运行,因为我之前只有 ApnsManager
,现在正在添加第二个 PuNoManager
、FcmManager
。问题源于依赖 class 请求注入 List<PuNoManager>
而不仅仅是 ApnsManager
.
Kotlin 中的 List<X>
在 JVM 中被转换为 java.util.List<? extends X>
。显然,Guice 不支持注入此类值。为避免此处使用通配符,您可以使用 MutableList<X>
代替,它转换为 java.util.List<X>
尝试将 @JvmSuppressWildcards
添加到模块 class。
我有一个带有几个实现的接口:
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)
}
}
当我有一个需要 List<PuNoManager>
的 class 时,问题就出现了——Guice 抱怨类型没有被绑定:
Explicit bindings are required and java.util.List<? extends ...PuNoManager> is not explicitly bound.
while locating java.util.List<? extends ...PuNoManager>
我知道我的 Guice 设置正在运行,因为我之前只有 ApnsManager
,现在正在添加第二个 PuNoManager
、FcmManager
。问题源于依赖 class 请求注入 List<PuNoManager>
而不仅仅是 ApnsManager
.
List<X>
在 JVM 中被转换为 java.util.List<? extends X>
。显然,Guice 不支持注入此类值。为避免此处使用通配符,您可以使用 MutableList<X>
代替,它转换为 java.util.List<X>
尝试将 @JvmSuppressWildcards
添加到模块 class。