在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) } } 

这工作,但失去了所有的仿制药信息。 是否有可能限制这个解析器的特定子集,即做

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

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

只有类允许在类文字的左侧

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

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