作为运营商,我不清楚kotlin文档

文档对我来说真的很神秘

通常,如果转换不可行,转换运算符将抛出exception。 >因此,我们称之为不安全的。 Kotlin中不安全的转换由中缀运算符> as完成(请参阅运算符优先级):

val x:String = y作为字符串

因为“as”这个词在网络引擎中不容易find,所以我不能理解asas的用法是以什么方式与运营商有关的

鉴于此代码:

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为什么variables持有人应该指向一个内部类的方法,这真是令我困惑。 我宁愿做val holderOther = NewsViewHolder.bind(item)

为什么删除行holder as NewsViewHolder影响下面的行是智能铸造 。

无论何时您的代码检查一个types或执行一个as -cast,Kotlin编译器都会分析控制流,并且如果该variables以后不能更改,编译器允许您从该点使用该variables,就好像它的types是检查。

在你的例子中, holder as NewsViewHolder检查函数参数是一个NewsViewHolder 。 鉴于(1)函数参数不能被重新分配,(2)只有holder实际上是一个NewsViewHolder (并会抛出一个exception,否则)该函数将继续执行,编译器将holder作为NewsViewHolder余下的function。

这反过来又允许您在holder上调用fun bind(item: RedditNewsItem) ,而无需另外显式fun bind(item: RedditNewsItem)或使用单独的variables。

聪明的投入既是直接的, is检查。 你可以改为像(虽然改变了原始代码的语义):

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

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