在使用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
异常。
我缺少什么才能找到这些豆子?
答案 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
,所以它并不是特别危险,只是丑陋。
建议或更好的解决方案。