【问题标题】:Kotlin overriding supertype variablesKotlin 覆盖超类型变量
【发布时间】:2018-02-23 11:02:37
【问题描述】:

考虑两个类:

abstract class ParentRepository {}

class ChildRepository : ParentRepository {}

abstract class ParentClass {
    protected abstract var repository: ParentRepository
}

class ChildClass : ParentClass {
    override var repository: ChildRepository
}

最后一部分不起作用:

override var repository: ChildRepository

它会抱怨:

Type of 'repository' doesn't match the type of the overridden var-property 'protected abstract var repository: ParentRepository

我理解这个问题,但我不明白为什么这不起作用 - ChildRepository 是 ParentRepository 的一个实例,这是我从 Java 中习惯的常见事情。

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    您必须将 repository 声明为 val。您仍然可以将其覆盖为 var:

    protected abstract val repository: ParentRepository
    
    override var repository: ChildRepository
    

    【讨论】:

      【解决方案2】:

      您必须考虑到,在 Kotlin 中,属性是一组 getter 和 setter。 val 只有一个 getter,而 var 也定义了一个 setter。因此,您可以将repository 设置为ParentRepository 实例,该实例可能不是ChildRepository 的实例。

      如果您考虑泛型的差异,您会看到相同的行为。虽然您可以将 协方差 <out T> 用于 getter,但您必须将 逆变 <in T> 用于 setter。

      【讨论】:

        【解决方案3】:

        使用关键字open

        protected open var repository: ParentRepository
        

        【讨论】:

        • 我们不需要override关键字?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-16
        • 1970-01-01
        • 2021-08-24
        • 2016-02-28
        • 1970-01-01
        • 2016-10-23
        相关资源
        最近更新 更多