Использование в 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>>() {})
Другие вопросы по тегам