传入参数时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 } }
但我不确定这是最好的方法
如果在传递的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 } }