2017-02-20 10 views
1

У меня есть интерфейс с несколькими реализациями:Почему 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.

+1

Попробуйте 'Список @JvmSuppressWildcards ' или '' MutableList

+0

Большого обходной путь идея-аннотации не работает, но изменить конструктор по запросу «MutableList » заставил инъекцию работать правильно. Когда я вытаскиваю отладчик в методе '@ Provides',' listOf() 'создает' ArrayList', который действительно является изменяемым списком. –

+0

Я думаю, что аннотация должна быть 'List <@JvmSuppressWildcards PuNoManager>'? –

ответ

1

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

Смежные вопросы