2017-02-20 1 views
1

J'ai une interface avec deux implémentations:Pourquoi Guice ne trouve-t-il pas ma liaison 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) { ... } 
} 

qui sont tous deux liés à mon Module, ainsi que d'une méthode @Provides -annotated pour obtenir un 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) 
    } 
} 

Le problème se produit lorsque j'ai une classe qui a besoin de List<PuNoManager> -Le code se plaint que le type n'a pas été lié:

Explicit bindings are required and java.util.List<? extends ...PuNoManager> is not explicitly bound. 
    while locating java.util.List<? extends ...PuNoManager> 

Je sais que mon installation Guice fonctionne, comme je l'avais auparavant juste le ApnsManager et j'ajoute le second PuNoManager, FcmManager. Le problème provient de la classe dépendante demandant l'injection de List<PuNoManager> au lieu de seulement ApnsManager.

+1

Essayez '' @JvmSuppressWildcards Liste ou '' MutableList

+0

Grande idée-la solution de contournement annotation n'a pas fonctionné, mais en changeant le constructeur à la demande un 'MutableList ' a eu l'injection pour fonctionner correctement. Lorsque je retire le débogueur dans la méthode '@ Provides' le' listOf() 'crée un' ArrayList', qui est en effet une liste mutable. –

+0

Je pense que l'annotation devrait être 'List <@JvmSuppressWildcards PuNoManager>'? –

Répondre

1

List<X> dans Kotlin est traduit à java.util.List<? extends X> sur la machine virtuelle Java. Apparemment, Guice ne supporte pas l'injection de telles valeurs. Pour éviter le caractère générique ici, vous pouvez utiliser un MutableList<X> à la place, ce qui se traduit par java.util.List<X>