通用类的自动装配子类

时间:2018-08-27 18:54:39

标签: java spring spring-boot generics kotlin

在使用Kotlin的Spring Boot 2中,我试图创建一系列扩展了通用类但为其提供特定类型的组件:

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 :(得分:0)

我发现一个解决方案是接受星标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,所以它并不是特别危险,只是丑陋。

建议或更好的解决方案。