Несоответствие типа Котлина при прохождении в параметре

Я переопределяю функцию в родительском классе, который принимает параметр типа 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 {// Я также попытался определить его с помощью параметра типа fun getModelId (model: M), но это не сработало. abstract fun getModelId (модель: Any?): Любой? }

 data class Venue (id: String) 

Я также рассмотрел

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

но я не уверен, что это лучший способ

Если нормально возвращать значение null если переданная model не является экземпляром объекта, то вы можете просто использовать безопасный листинг и безопасный вызов так же просто, как:

 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 } }