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