Из документации kotlin мне не ясно, как оператор

документация действительно загадочна для меня

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

val x: String = y as String

потому что слово «как» найти нелегко в интернет-двигателях, я не могу понять, как использование и как это связано с оператором

Учитывая этот код:

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, item: ViewType) { holder as NewsViewHolder//why is not called holder2 considering is adressed to NewsViewHolder? holder.bind(item as RedditNewsItem) } 

если я избавлюсь от NewsViewHolder, точки intelliJ привяжутся красным цветом. Причина в том, что в одном классе есть внутренний класс с привязкой метода

  inner class NewsViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder( parent.inflate(R.layout.news_item)) { private val imgThumbnail = itemView.img_thumbnail private val description = itemView.description private val author = itemView.author private val comments = itemView.comments private val time = itemView.time fun bind(item: RedditNewsItem) { imgThumbnail.loadImg(item.thumbnail) description.text = item.title author.text = item.author comments.text = "${item.numComments} comments" time.text = item.created.getFriendlyTime() super.itemView.setOnClickListener { viewActions.onItemSelected(item.url)} } } 

но я указал в комментариях, если метод пропускает владельца с классом Recycler.ViewHolder, почему владелец переменной следует указывать на метод внутреннего класса, это действительно сбивает меня с толку. Я бы предпочел сделать val holderOther = NewsViewHolder.bind (item)

Причина, по которой удаление holder as NewsViewHolder строки в holder as NewsViewHolder влияет на строку ниже, – это умное литье .

Всякий раз, когда ваш код проверяет тип или выполняет as -cast, компилятор Kotlin анализирует поток управления и, если переменная не может измениться позже во времени, компилятор позволяет вам использовать переменную из этой точки, как если бы ее тип был тем, который вы проверен.

В вашем примере holder as NewsViewHolder проверяет параметр функции на наличие NewsViewHolder . Учитывая, что (1) параметр функции не может быть переназначен, и (2) функция продолжит выполнение только в том случае, если holder фактически является NewsViewHolder (и иначе генерирует исключение), компилятор рассматривает holder как NewsViewHolder в остальной части функции.

Это, в свою очередь, позволяет вам вызвать fun bind(item: RedditNewsItem) на holder без другого явного приведения или с использованием отдельной переменной.

Умные отливки уважают как as -casts, так и -checks. Вы могли бы вместо этого написать (например, изменить семантику исходного кода):

 if (holder is NewsViewHolder) { holder.bind(item as RedditNewsItem) } 

Опять же, код внутри предложения if будет выполняться только в том случае, если holder является NewsViewHolder , поэтому вы можете использовать holder в качестве NewsViewHolder внутри этой области действия и, в частности, для вызова функций этого типа.

Intereting Posts
Добавление «предоставленной» конфигурации в библиотеку kotlin / java с использованием gradle View имеет значение null в onCreateView android Kotlin: Как я могу использовать отражение в пакетах? Как установить кодировку источника Kotlin в Gradle? Настройка Kotlin в новом проекте Android Studio Выражение высказывания в Котлине Есть ли способ остановить сбой в пустое десятичное значение в EditText в kotlin? Использование комнаты в качестве одноэлементного в kotlin Могу ли я запустить Android Studio 3.0 без Kotlin? Преобразует ли файл Kotlin в java, добавив к нему java-код и вернувшись обратно в Kotlin так же, как добавление кода непосредственно в файл Kotlin? Позиция метки `@` в Котлине, обозначая приемник с `this` Невозможно однозначно идентифицировать макет при добавлении вложенных фрагментов с помощью фрагментации Элементы представления Android NavigationView Headerlayout не запускают события щелчка Отзыв Android Retrofit, если ключ не является строкой Тестирование модуля Kotlin для функциональных параметров и объектов