在Multibinder中使用泛型

时间:2016-05-23 14:11:29

标签: generics guice kotlin

在使用com.google.inject.multibindings.Multibinder时,我对泛型有点困惑:

interface MessageParser<S, T> {
  fun accept(msg: S): Boolean
  fun parser(msg: S): T
}
class Parser1 : MessageParser<Mime, Parsed>
class Parser2 : MessageParser<Mime, Parsed>

class EmailModule : AbstractModule() {
  override fun configure() {
      val parsers = Multibinder.newSetBinder(binder(), MessageParser::class.java)
      parsers.addBinding().to(Parser1::class.java)
      parsers.addBinding().to(Parser2::class.java)
  }
}

这有效,但丢失了所有泛型信息。是否可以将其限制为特定的解析器子集,即执行

val parsers: MessageParser<Mime, Parsed> =
  Multibinder.newSetBinder(binder(), MessageParser<Mime, Parsed>::class.java)

现在,这会产生编译错误:

  

只允许在类文字的左侧使用类

1 个答案:

答案 0 :(得分:1)

使用TypeLiteral而不是类文字来注入具有泛型类型(https://github.com/google/guice/wiki/FrequentlyAskedQuestions#how-to-inject-class-with-generic-type)的类。有关Java示例,请参阅Multibinding with generics。以下是Kotlin的等效例子。

val parsers = Multibinder.newSetBinder(binder(), object : TypeLiteral<MessageParser<Mime, Parsed>>() {})