传入参数时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 } 

抽象类ParentClass {//我也试着用类型参数fun getModelId(model:M)来定义它,但是没有成功。 抽象的乐趣getModelId(模型:任何?):任何? }

 data class Venue (id: String) 

我也考虑过了

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

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

2 Solutions collect form web for “传入参数时Kotlin类型不匹配”

如果在传递的model不是Venue的实例的情况下可以返回null ,则可以使用安全的投射和安全的调用 ,如下所示:

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

否则,在Elvis操作符之后添加默认值?: ,如下所示:

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

或者回到一个if或者when将会涉及一个聪明的演员的声明:

 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 } 

你可以使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 } } 
  • 从不同的界面覆盖相同的签名
  • Kotlin language will be the best programming language for Android.