为什么 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,现在正在添加第二个 PuNoManagerFcmManager。问题源于依赖 class 请求注入 List<PuNoManager> 而不仅仅是 ApnsManager.

Kotlin 中的

List<X> 在 JVM 中被转换为 java.util.List<? extends X>。显然,Guice 不支持注入此类值。为避免此处使用通配符,您可以使用 MutableList<X> 代替,它转换为 java.util.List<X>

尝试将 @JvmSuppressWildcards 添加到模块 class。