在使用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)
现在,这会产生编译错误:
只允许在类文字的左侧使用类
答案 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>>() {})