为什么不是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并添加第二个PuNoManagerFcmManager 。 问题源于请求注入List<PuNoManager>的相关类,而不仅仅是ApnsManager

Kotlin中的List<X>被转换为java.util.List<? extends X> 在JVM上java.util.List<? extends X> 。 显然,Guice不支持注入这些值。 为了避免这里的通配符,可以使用MutableList<X>来代替java.util.List<X>