У меня есть интерфейс с несколькими реализациями:Почему Guice не находит мой список <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
, наряду с -annotated методом @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>
-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
.
Попробуйте 'Список @JvmSuppressWildcards' или '' MutableList –
Большого обходной путь идея-аннотации не работает, но изменить конструктор по запросу «MutableList» заставил инъекцию работать правильно. Когда я вытаскиваю отладчик в методе '@ Provides',' listOf() 'создает' ArrayList', который действительно является изменяемым списком. –
Я думаю, что аннотация должна быть 'List <@JvmSuppressWildcards PuNoManager>'? –