首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Guice MapBinder

Guice MapBinder
EN

Stack Overflow用户
提问于 2017-07-25 02:00:10
回答 2查看 1.2K关注 0票数 1

我在Java + Kotlin项目中使用Guice将算法实现的映射注入到特定的bean中,但我不断得到

代码语言:javascript
复制
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

模块的定义如下所示:

代码语言:javascript
复制
class AlgorithmsModule : AbstractModule() {

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

}

调用者代码是:

代码语言:javascript
复制
@Singleton
class SchedulingJobConsumer
@Inject constructor(
        @Named("scheduling.channel") channel: Channel,
        @Named("scheduling.algorithms") val schedulers: Map<String, SchedulingAlgorithm>
) : DefaultConsumer(channel) ...

但当我这么做的时候

代码语言:javascript
复制
injector.getInstance(Key.get(new TypeLiteral<Map<String, SchedulingAlgorithm>>() {}, named("scheduling.algorithms")))

它就在那里。怎么了?

EN

回答 2

Stack Overflow用户

发布于 2017-09-12 21:11:06

问题在于Kotlin Generics != Java Generics这一事实。

这个Kotlin代码。

代码语言:javascript
复制
 @Named("scheduling.algorithms") val schedulers: Map<String, SchedulingAlgorithm>

获取编译为

代码语言:javascript
复制
Map<String, ? extends SchedulingAlgorithm> and not Map<String, SchedulingAlgorithm>

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

票数 2
EN

Stack Overflow用户

发布于 2018-03-11 14:07:41

您可以尝试在AlgorithmsModule中添加以下成员方法,而不是使用MapBinder

代码语言:javascript
复制
@Provides
@Singleton
@Named("scheduling.algorithms")
fun schedulingAlgorithms(): Map<String, @JvmSuppressWildcards SchedulingAlgorithm> {
    return IntervalProjectionAlgorithm()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45287126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档