Guice MapBinder

我在Java + Kotlin项目中使用Guice将算法实现的映射注入到特定的bean中,但是我一直在获取

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 

模块的定义是这样定义的:

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

而来电号码是:

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

但是当我这样做

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

它在那里。 怎么了?

问题是Kotlin Generics!= Java泛型。

这Kotlin代码。

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

获取编译为

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

当注射Guice正在寻找Map<String, ? extends SchedulingAlgorithm> ,? Map<String, ? extends SchedulingAlgorithm> ,因为MapBinderMap<String, SchedulingAlgorithm>创建了绑定,所以它没有绑定。