作为运营商,我不清楚kotlin文档
文档对我来说真的很神秘
通常,如果转换不可行,转换运算符将抛出异常。 >因此,我们称之为不安全的。 Kotlin中不安全的转换由中缀运算符> as完成(请参阅运算符优先级):
val x:String = y作为字符串
因为“as”这个词在网络引擎中不容易找到,所以我不能理解as和as的用法是以什么方式与运营商有关的
鉴于此代码:
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
影响下面的行是智能铸造 。
无论何时您的代码检查一个类型或执行一个as
-cast,Kotlin编译器都会分析控制流,并且如果该变量以后不能更改,编译器允许您从该点使用该变量,就好像它的类型是检查。
在你的例子中, holder as NewsViewHolder
检查函数参数是一个NewsViewHolder
。 鉴于(1)函数参数不能被重新分配,(2)只有当holder
实际上是一个NewsViewHolder
(并会抛出一个异常,否则)该函数将继续执行,编译器将holder
作为NewsViewHolder
余下的功能。
这反过来又允许您在holder
上调用fun bind(item: RedditNewsItem)
,而无需另外显式fun bind(item: RedditNewsItem)
或使用单独的变量。
聪明的投入既是直接的, is
检查。 你可以改为像(虽然改变了原始代码的语义):
if (holder is NewsViewHolder) { holder.bind(item as RedditNewsItem) }
同样,只有当holder
是NewsViewHolder
, if
子句中的代码才会运行,因此您可以在该范围内使用holder
作为NewsViewHolder
,特别是调用此类型的函数。