2017-07-24 5 views
0

Ich bin mit Guice in Java + Kotlin Projekt Karte Algorithmus Implementierung in eine bestimmte Bean zu injizieren, aber ich halteGuice MapBinder

1) No implementation for java.util.Map<java.lang.String, ? extends com.scherule.scheduling.algorithms.SchedulingAlgorithm> annotated with @com.google.inject.name.Named(value=scheduling.algorithms) was bound. 
    while locating java.util.Map<java.lang.String, ? extends com.scherule.scheduling.algorithms.SchedulingAlgorithm> annotated with @com.google.inject.name.Named(value=scheduling.algorithms) 
    for the 2nd parameter of com.scherule.scheduling.SchedulingJobConsumer.<init>(SchedulingJobConsumer.kt:17) 
    while locating com.scherule.scheduling.SchedulingJobConsumer 

Die Definition des Moduls erhalten wird wie folgt definiert:

class AlgorithmsModule : AbstractModule() { 

    override fun configure() { 
     MapBinder.newMapBinder(binder(), 
       String::class.java, 
       SchedulingAlgorithm::class.java, 
       Names.named("scheduling.algorithms") 
     ).addBinding("interval-projection").toInstance(IntervalProjectionAlgorithm()) 
    } 

} 

Und die Anrufer-Nummer lautet:

@Singleton 
class SchedulingJobConsumer 
@Inject constructor(
     @Named("scheduling.channel") channel: Channel, 
     @Named("scheduling.algorithms") val schedulers: Map<String, SchedulingAlgorithm> 
) : DefaultConsumer(channel) ... 

Aber wenn ich

injector.getInstance(Key.get(new TypeLiteral<Map<String, SchedulingAlgorithm>>() {}, named("scheduling.algorithms"))) 

ist es da. Was ist los mit dir?

+0

Versuchen Sie, die Deklaration '@ JvmSuppressWildcards' der Deklaration von' val schedulers' hinzuzufügen – yole

+0

Das Hinzufügen zur Konstruktordeklaration ändert nichts. Wenn Sie dies auf einem Feld tun, ändert sich die Fehlermeldung in No -Implementierung für java.util.Map (...). Es scheint also, dass es diese nicht einmal finden kann. – kboom

+0

Die Fehlermeldung scheint zu sagen, dass es eine Implementierung für SchedulingAlgorithm nicht finden konnte. Wie ist das definiert? – Les

Antwort

0

Das Problem ist in der Tat Kotlin Generics! = Java Generics.

Dieser Kotlin-Code.

@Named("scheduling.algorithms") val schedulers: Map<String, SchedulingAlgorithm> 

erhält als

zusammengestellt
Map<String, ? extends SchedulingAlgorithm> and not Map<String, SchedulingAlgorithm> 

Beim Einspritzen Guice für Map<String, ? extends SchedulingAlgorithm> suchen, für die sie keine Bindung als die MapBinder die Bindung für Map<String, SchedulingAlgorithm> erstellt.