2017-09-24 49 views
1

documentation真是神祕對我從科特林文檔不是很清楚,我的作爲運營商

通常情況下,如果轉換是不可能投運營商拋出異常。 >因此,我們稱之爲不安全。在科特林不安全投是用管道符完成>作爲(見運算符優先級):

VAL X:字符串= Y作爲字符串

因爲這個詞「爲」不容易的找到互聯網引擎,我無法理解使用和以何種方式是與運營商

鑑於此代碼:

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)

+0

搜索[類型轉換](https://en.wikipedia.org/wiki/Type_conversion)。 – nhaarman

+0

mmh類型鑄造保持也用於類型轉換,我認爲在手冊中引用的鑄件是指在Java中鑄造,我開始更好地理解 – Drocchio

回答

3

刪除行holder as NewsViewHolder影響下面一行的原因是smart casting

無論何時您的代碼檢查某個類型或執行一個播放,Kotlin編譯器都會分析控制流,並且如果該變量以後不能更改,則編譯器允許您使用該點的變量,就好像它的類型一樣是你檢查的人。

在你的例子中,holder as NewsViewHolder檢查函數參數是NewsViewHolder。鑑於(1)函數參數不能被重新分配,並且(2)僅當holder實際上是NewsViewHolder(並且否則將引發異常)時,函數將繼續執行,編譯器將holder作爲NewsViewHolder作爲函數的其餘部分處理。

這反過來使您可以在holder上調用fun bind(item: RedditNewsItem),而無需其他顯式轉換或使用單獨的變量。

智能投入尊重as -casts和is-檢查。你可以代替寫什麼樣子(雖然改變原始代碼的語義):

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

再次,if子句中的代碼才能運行holderNewsViewHolder,所以你允許使用holder作爲該範圍內的NewsViewHolder,特別是調用這種類型的功能。

+0

偉大的解釋,從我關於kotlin文檔的觀點來看最大的問題是應該更多面向Java的。我的意思是從Java到Kotlin。你最終帶來的例子使我明白了這個概念,因爲這將是一個Java例子(儘管不是我會有一個代替) – Drocchio