我在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")))它就在那里。怎么了?
发布于 2017-09-12 21:11:06
问题在于Kotlin Generics != Java Generics这一事实。
这个Kotlin代码。
@Named("scheduling.algorithms") val schedulers: Map<String, SchedulingAlgorithm>获取编译为
Map<String, ? extends SchedulingAlgorithm> and not Map<String, SchedulingAlgorithm>当注入Guice时,它正在寻找没有绑定的Map<String, ? extends SchedulingAlgorithm>,因为MapBinder为Map<String, SchedulingAlgorithm>创建了绑定。
发布于 2018-03-11 14:07:41
您可以尝试在AlgorithmsModule中添加以下成员方法,而不是使用MapBinder
@Provides
@Singleton
@Named("scheduling.algorithms")
fun schedulingAlgorithms(): Map<String, @JvmSuppressWildcards SchedulingAlgorithm> {
return IntervalProjectionAlgorithm()
}https://stackoverflow.com/questions/45287126
复制相似问题