我不知道我想要做什么的术语,这使得问这个问题很困难。这是一个最小的例子:
abstract class Obj() {
abstract fun checkIssues() : List<String>
fun runRules(rules: List<Rule<Obj>>): List<String> {
return rules.mapNotNull {
it.check(this)
}
}
}
class Field(): Obj(){
companion object {
val rules = listOf(MissingResetRule())
}
override fun checkIssues(): List<String> = runRules(rules)
}
class MissingResetRule : Rule<Field>() {
override fun check(obj: Field): String? = ""
}
abstract class Rule<T: Obj> {
abstract fun check(obj: T): String?
}
问题在于它List<MissingResetRule>
不是 的子类,List<Rule<Obj>>
或者更准确地说,MissingRule
不是 的子类Rule<Obj>
。这意味着runRules(rules)
抱怨类型错误。但是Field
是 的子类,Obj
所以我会认为那Rule<Field>
将是Rule<Obj>
. 我似乎无法弄清楚如何告诉编译器这里的一切都是有效的。
我已经阅读了这里的文档:https : //kotlinlang.org/docs/reference/generics.html很多次,但无法理解它如何应用于上面的代码。
据我了解您的问题,您尝试使用一个函数runRules
来准确获取相应类型的规则。然后使这个函数通用:
abstract class Obj() {
abstract fun checkIssues() : List<String>
}
fun <T : Obj> T.runRules(rules: List<Rule<T>>): List<String> {
return rules.mapNotNull {
it.check(this)
}
}
class Field(): Obj(){
companion object {
val rules = listOf(MissingResetRule())
}
override fun checkIssues(): List<String> = runRules(rules)
}
class MissingResetRule : Rule<Field>() {
override fun check(obj: Field): String? = ""
}
abstract class Rule<T: Obj> {
abstract fun check(obj: T): String?
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句