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
.
Essayez '' @JvmSuppressWildcards Liste ou '' MutableList –
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. –
Je pense que l'annotation devrait être 'List <@JvmSuppressWildcards PuNoManager>'? –