gpt4 book ai didi

generics - 在 Multibinder 的泛型中使用

转载 作者:行者123 更新时间:2023-12-02 13:24:34 24 4
gpt4 key购买 nike

使用 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)

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

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

最佳答案

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

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

关于generics - 在 Multibinder 的泛型中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37393364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com