【问题标题】:Kotlin type mismatch while passing in parameter传入参数时 Kotlin 类型不匹配
【发布时间】:2018-04-15 07:56:17
【问题描述】:

我正在重写父类中的一个函数,该函数采用 Any? 类型的参数。我想要任何?成为 Venue 类型的实例,以便我可以提取它的 id,但是,我不能使用 getModelId(model: Venue?) 覆盖该函数,因为它不是在超类中定义的。确保对于这个用例,模型的类实例是 Venue? 并且我可以从中提取我想要的数据的最佳方法是什么?

open class VenueAdapter: ParentClass() {
    override fun getModelId(model: Any?): Any? {
        //here I want to be able to pull the id out of the Venue class instance
        return model.id

}

abstract class ParentClass {
    //I've also tried defining it with a type parameter fun <M : Any?> getModelId(model: M) but that hasnt' worked.
    abstract fun getModelId(model: Any?) : Any? 
}


data class Venue (id: String)

我也考虑过

override fun getModelId(model: Any?): Any? {
    when (model) {
        is Venue -> return model.id
    }

}

但我不确定这是最好的方法

【问题讨论】:

  • 这违反了里氏替换原则。 ParentClass 的用户可以传递任何东西,并且实现应该能够处理它。你的VenueAdapter 保证比它覆盖的要少(或者如果你想这样看它需要更多),这意味着当你插入这个实现时,曾经突然工作的调用者不会。您可能需要重新检查设计,看看是否有更好的设置。

标签: android oop inheritance kotlin


【解决方案1】:

您可以将ParentClass 设为通用:

interface ParentClass<in T, out R> {
    fun getModelId(model: T?): R
}

open class VenueAdapter : ParentClass<Venue, Int?> {
    override fun getModelId(model: Venue?): Int? {
        return model?.id
    }
}

【讨论】:

  • 我认为 VenueAdapter 应该从 ParentClass 扩展,但使用类型 Venue。像这样open class VenueAdapter : ParentClass&lt;Venue, Int?&gt; { override fun getModelId(model: Venue?): Int? { return model?.id } }
  • 抱歉,忘记改了 ;)
  • 恕我直言,不要将可为空的实例传递给 getModelId。很明显,在大多数情况下,空实例将返回空 id。利用 kotlin 可空性来正确建模
【解决方案2】:

如果在传递的model 不是Venue 的实例的情况下可以返回null,那么您可以只使用safe castsafe call,如下所示:

override fun getModelId(model: Any?): Any? = (model as? Venue)?.id

否则,请在Elvis operator ?: 之后添加您的默认值,如下所示:

override fun getModelId(model: Any?): Any? = (model as? Venue)?.id ?: defaultId

或者退回到涉及smart castifwhen 语句:

override fun getModelId(model: Any?): Any? = 
    if (model is Venue)
        model.id else
        defaultId

override fun getModelId(model: Any?): Any? = 
    when (model) {
        is Venue -> model.id
        else -> defaultId
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多