android - 传入参数时 Kotlin 类型不匹配

标签 android oop inheritance kotlin

我正在重写父类中的一个函数,该函数接受 Any 类型的参数?我要任何?成为 Venue 类型的一个实例,这样我就可以提取它的 ID,但是,我无法使用 getModelId(model: Venue?) 覆盖该函数,因为这不是它在 super 中的定义方式类(class)。什么是确保对于此用例模型的类实例是 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
    }

}

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

最佳答案

如果传递的 model 不是 Venue 的实例,返回 null 是可以的,那么你可以只使用 safe cast 和一个 safe 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
    }

关于android - 传入参数时 Kotlin 类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47081288/

相关文章:

c# - 所有(OOP)依赖项的根存储在哪里?

Angular 4+ 服务引用了另一个服务良好实践

javascript - ES6 类继承可以转换为等效的 ES5 代码吗?

android - 如何使用保存实例状态保存 Activity 状态?

java - 错误: incompatible types: Message cannot be converted to int?

c++ - 具有转换方法的两个类

c++ - 我能以某种方式使用继承吗

C# - 使所有派生类调用基类构造函数

android - boundCenter()/boundCenterBottom() 必须用于 ItemizedOverlay 中的标记?

android - Firestore 更新查询未执行