为什么不是Guice找到我的List <Interface>绑定?
我有一个接口与几个实现:
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
-annotated方法来获取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>
-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
。 问题源于请求注入List<PuNoManager>
的相关类,而不仅仅是ApnsManager
。
Kotlin中的List<X>
被转换为java.util.List<? extends X>
在JVM上java.util.List<? extends X>
。 显然,Guice不支持注入这些值。 为了避免这里的通配符,可以使用MutableList<X>
来代替java.util.List<X>