У меня есть интерфейс с несколькими реализациями:
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
.
List<X>
в Kotlin переводится в java.util.List<? extends X>
java.util.List<? extends X>
на JVM. По-видимому, Guice не поддерживает инъекцию таких ценностей. Чтобы избежать подстановочного знака здесь, вы можете вместо этого использовать MutableList<X>
, что переводит на java.util.List<X>