2017-07-24 62 views
0

我使用吉斯在Java中+科特林项目注入算法实现的地图到一个特定的bean,但我不断收到吉斯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 

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

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"))) 

它在那里。怎么了?

+0

尝试在'val schedulers'的声明中添加'@ JvmSuppressWildcards'注释 – yole

+0

将它添加到构造函数声明中不会改变任何内容。在字段上执行此操作会将错误消息修改为java.util.Map的No实现(...)所以它似乎甚至找不到它。 – kboom

+0

错误消息似乎说它找不到SchedulingAlgorithm的实现。那是如何定义的? – Les

回答

0

问题在于Kotlin Generics!= Java Generics。

This Kotlin code。

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

获取在注射吉斯寻找Map<String, ? extends SchedulingAlgorithm>为它不具有约束力的MapBinder创建的绑定为Map<String, SchedulingAlgorithm>编译为

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