gpt4 book ai didi

android - 我不清楚 kotlin 文档中的 as 运算符

转载 作者:行者123 更新时间:2023-11-29 16:51:06 25 4
gpt4 key购买 nike

documentation对我来说真的很神秘

Usually, the cast operator throws an exception if the cast is not possible. >Thus, we call it unsafe. The unsafe cast in Kotlin is done by the infix operator >as (see operator precedence):

val x: String = y as String

因为“as”这个词在互联网引擎中不容易找到,所以我无法理解as的用法以及与运算符is的关系

给定这段代码:

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 点将绑定(bind)为红色。原因是因为在同一个类中有一个带有方法绑定(bind)的内部类

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

但我在评论中指出,如果方法传递 holder 与类 Recycler.ViewHolder 为什么变量 holder 应该指向内部类的方法,这让我很困惑。我宁愿做val holderOther =NewsViewHolder.bind(item)

最佳答案

删除行 holder as NewsViewHolder 影响下面行的原因是 smart casting .

每当您的代码检查类型或执行 as-cast 时,Kotlin 编译器都会分析控制流,如果变量稍后无法及时更改,则编译器允许您使用该变量点上,就好像它的类型就是您检查的类型一样。

在您的示例中,holder as NewsViewHolder 检查函数参数是否为 NewsViewHolder。鉴于 (1) 函数参数无法重新分配,并且 (2) 只有当 holder 实际上是 NewsViewHolder 时函数才会继续执行(否则会抛出异常),编译器在函数的其余部分将 holder 视为 NewsViewHolder

反过来,这允许您在 holder 上调用 fun bind(item: RedditNewsItem),而无需另一个显式转换或使用单独的变量。

智能转换尊重as-转换和is-检查。你可以这样写(尽管改变了原始代码的语义):

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

同样,只有当 holderNewsViewHolder 时,if 子句中的代码才会运行,因此您可以使用 holder 作为该范围内的 NewsViewHolder,特别是调用此类型的函数。

关于android - 我不清楚 kotlin 文档中的 as 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46392172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com