Kotlin – TypeCastException на view.getTag ()

У меня есть класс под названием ItemClickSupport, который прикрепляет ItemClick к RecyclerView:

Это функция init:

init { mRecyclerView.setTag(R.id.item_click_support, this) mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener) } 

и иметь companion object чтобы добавить его в recyclerView:

 companion object { fun addTo(view: RecyclerView): ItemClickSupport { var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as ItemClickSupport if (support == null) { support = ItemClickSupport(view) } return support } } 

Когда я запускаю свое приложение и пытаюсь добавить clickListener в recyclerView, я получаю

Причина: kotlin.TypeCastException: null не может быть применено к непустому типу com.dancam.subscriptions.Support.ItemClickSupport в com.dancam.subscriptions.Support.ItemClickSupport $ Companion.addTo (ItemClickSupport.kt: 80) в com.dancam .subscriptions.AddSubscription.AddSubscription.onCreate (AddSubscription.kt: 79)

с первой ошибкой, указывающей на эту строку в функции addTo :

 var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as ItemClickSupport 

и второй в этом в моей main_activity :

 ItemClickSupport.addTo(recyclerView!!).setOnItemClickListener( object: ItemClickSupport.OnItemClickListener { override fun onItemClicked(recyclerView: RecyclerView, position: Int, v: View ) { ... } }) 

Что мне не хватает?

Из справочника Kotlin ( https://kotlinlang.org/docs/reference/typecasts.html ):

Оператор «Небезопасный»

Как правило, оператор литья бросает исключение, если бросок невозможен. Таким образом, мы называем это небезопасным. Небезопасный бросок в Котлине выполняется оператором infix как (см. Приоритет оператора):

 val x: String = y as String 

Обратите внимание, что значение null не может быть перенесено в String, поскольку этот тип не является нулевым, т. Е. Если y является нулевым, код выше генерирует исключение. Чтобы соответствовать семантике Java cast, мы должны иметь тип NULL в правой стороне листа, например:

 val x: String? = y as String? 

Вы также можете использовать так называемый «безопасный» (нулевой) оператор трансляции, который, насколько мне известно, эквивалентен:

 val x: String? = y as? String 

Итак, в вашем конкретном случае:

 var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as ItemClickSupport? 

или

 var support: ItemClickSupport? = view.getTag(R.id.item_click_support) as? ItemClickSupport 
  • эквивалент тега <fragment> в anko DSL
  • Как установить атрибут веса динамически из кода Котлина?
  • Получение абсолютного пути к файлу из содержимого URI для найденных изображений
  • JDK требуется для Kotlin?
  • Как вызвать функцию в другом классе
  • Как настроить версию Kotlin в Android Studio?
  • Kotlin и идиоматический способ писать, «если не null, else ...», основанный на изменяемой ценности
  • Невозможно заменить SAM-конструктор лямбдой, когда первый аргумент - это класс с одним методом
  • Kotlin on android: Не удается найти основной объединенный манифест. Что вызывает эту ошибку?
  • Как получить String от Unit в Android-Kotlin
  • Царство превращает транзакцию в наблюдаемую
  • Давайте будем гением компьютера.