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)抱怨类型错误。但是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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章