在 Multibinder 中使用泛型

Using in Generics in Multibinder

我在使用 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)
  }
}

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

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

现在,这会生成一个编译器错误:

Only classes are allowed on the left hand side of a class literal

使用 TypeLiteral 而不是 class 文字来注入具有通用类型的 class (https://github.com/google/guice/wiki/FrequentlyAskedQuestions#how-to-inject-class-with-generic-type). See Multibinding with generics 用于 Java 示例。下面是等效的 Kotlin 示例。

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