在 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
异常。
我错过了什么才能找到这些豆子?
我找到的一个解决方案是接受一个星形投影Super<*>
,然后在我访问它时投射它:
@Component
class MyService(
private val subs: List<Super<*>>
) {
@Suppress("UNCHECKED_CAST")
fun getSub(): List<Super<SomeType>>? = subs[0] as List<Super<SomeType>>
}
这有效,但我不喜欢它,因为我必须进行未经检查的演员表。我也无法进行检查转换,因为由于擦除,我无法确定泛型类型(如 with is Super<SomeType>
)。
既然Super
有界限,SomeType
它并不是特别危险,只是丑陋。
建议或更好的解决方案将不胜感激。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句