Kotlin中类定义和子类中的泛型类型



我不知道我要做什么的术语,这让提问变得困难。这里有一个最小的例子:

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)抱怨类型错误。但FieldObj的一个子类,所以我认为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?
}

最新更新