Использование в Generics в 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)
Прямо сейчас это генерирует ошибку компилятора:
Только классы разрешены в левой части литерала класса
1 ответ
Решение
Использовать TypeLiteral
вместо литерала класса, чтобы внедрить класс с универсальным типом ( https://github.com/google/guice/wiki/FrequentlyAskedQuestions). См. Multibinding с обобщениями для примера Java. Ниже приведен эквивалентный пример Kotlin.
val parsers = Multibinder.newSetBinder(binder(), object : TypeLiteral<MessageParser<Mime, Parsed>>() {})