Intereting Posts
Порядок вычисления побитовых операторов в Котлине Закрыть / скрыть Softkey от Android с Kotlin JavaRX: как вернуть кешированное значение немедленно и параллельно выполнить сетевой запрос ClassNotFoundException при последующих сборках после преобразования MainActivity в Kotlin Android – Kotlin: вернуть значение в async fun андроид, получивший манифест слияния с ошибкой после обновления до новой версии gradle Объявление об отказе от рекламы Kotlin REPL не работает с Pair onActivityResult не получает вызов при вызове java-активности из kotlin для результата У меня есть два метода расширения Kotlin для одного и того же класса, но с разными генерическими сигнатурами и компилятор жалуется библиотека kotlin klaxon для json Котлинский эквивалент тернарного оператора Скомпилируйте Kotlin с JavaScript Как решить: Ошибка: выполнение выполнено для задачи ': app: kaptDebugKotlin'? Котлин: назначается «это»? Как отключить ткань при выполнении теста

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

Я переопределяю функцию в родительском классе, который принимает параметр типа 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 } } 

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

Solutions Collecting From Web of "Несоответствие типа Котлина при прохождении в параметре"

Если нормально возвращать значение 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 } }