Подклассы Autowire универсального класса - PullRequest
0 голосов
/ 27 августа 2018

В Spring Boot 2, используя Kotlin, я пытаюсь создать серию компонентов, которые расширяют универсальный класс, но предоставляют ему определенный тип:

abstract class Super<in T: SomeType> {
  abstract fun someMethod(t: T): Boolean
}

// AnotherType and OneMoreType extend SomeType
@Component
class Sub1 : Super<AnotherType> {
  override fun someMethod(t: AnotherType) = true
}

@Component
class Sub2 : Super<OneMoreType> {
  override fun someMethod(t: OneMoreType) = true
}

Все это прекрасно компилируется, но затем я хочу собрать все это для другого компонента:

@Component
class MyService(
  private val subs: List<Super<SomeType>>
)

Это приводит к исключению no beans.

Чего мне не хватает, чтобы я смог найти эти бобы?

1 Ответ

0 голосов
/ 27 августа 2018

Решение, которое я нашел, состояло в том, чтобы принять проекцию звезды Super<*>, а затем разыграть ее, когда я получу к ней доступ:

@Component
class MyService(
  private val subs: List<Super<*>>
) {
  @Suppress("UNCHECKED_CAST")
  fun getSub(): List<Super<SomeType>>? = subs[0] as List<Super<SomeType>>
}

Это работает, но я не влюблен в это, потому что я должен сделать непроверенный актерский состав. Я также не могу выполнить проверенное приведение, потому что благодаря стиранию я не могу определить общий тип (например, is Super<SomeType>).

Поскольку Super имеет границы SomeType, это не особо опасно, просто безобразно.

Будем признательны за предложения или лучшее решение.

...