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