传递参数时Kotlin类型不匹配

时间:2017-11-02 17:29:22

标签: android oop inheritance kotlin

我正在覆盖父类中的一个函数,它接受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
    }

}

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

2 个答案:

答案 0 :(得分:1)

如果传递的null不是model的实例,可以返回Venue,那么您只需使用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

或者回退到ifwhen语句,其中涉及smart cast

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
    }

答案 1 :(得分:1)

您可以setting...compiler通用:

ParentClass