當前位置:
首頁 > 最新 > Kotlin跟findViewById 的類型推導衝突問題

Kotlin跟findViewById 的類型推導衝突問題

記錄一個小坑

1 描述

從 version 26 開始,com.android.support:appcompat-v7 中的 方法的返回值從 改成了 。

對於開發者來說,喜大普奔的好處當然是以後終於可以不用在每個 finViewById 方法前面加個醜陋的類型強轉了。 但是福兮禍兮,好事的背後也難免會有一些不如意的地方。

比如,如果你在用 Kotlin 的話,項目中可能會有很多類似這樣的代碼:

// 代碼 1 val textView = findViewById(R.id.textView) as TextView

這是 Kotlin 的習慣寫法,種寫法實際上是跟下面這種寫法是等價的

// 代碼 2 val textView : TextView = findViewById(R.id.textView) as TextView

由於 Kotlin 的 特性,我們可以在聲明 textView 變數的時候不必顯式說明,系統會自動從後面的賦值語句中推測出它的類型是 TextView 。

Type inference failed: Not enough information to infer parameter T in

funfindViewById ( id: Int ) : T!

Please specify it explicitly

意思是沒有足夠的信息來推斷 findViewById 的返回類型。

2 原因

上述錯誤的本質是 的衝突。

如上所說,我們對 textView 的定義並沒有說明其類型,它的類型是從後面的賦值語句中推導出來的。

而新版本的 findViewById ,其返回類型是 ,這是一個泛型的聲明,具體類型則是根據所賦值的變數類型來確定的。

—— 等號的左右兩邊互相依賴,互相還都沒有指明,可不就衝突報錯了么!

3 解決方案:

既然是因為『兩個相互依賴的類行推導都沒有指明類型』,那解決方案自然就是選其中一個指明類型咯。

3.1

在等號左邊聲明類型:

// 代碼 3 val textView : TextView = findViewById(R.id.textView)3.2

在等號右邊表明類型。

諸如這種帶泛型簽名的函數也是可以在調用時顯式地指明類型的:

// 代碼 4 val textView = findViewById(R.id.textView)4 總結

這只是個很簡單的小問題,很好解決,但是了解其本質的過程才是更讓人享受的過程~

有意思的是:As 默認支持 Kotlin 跟 findViewById 更新這兩件事 —— 都是在這次的 IO 大會上宣布的。而且現在(2017.06.05)用 AS 新建一個項目並開啟 Kotlin 支持,然後把 support-v7 包升級到 26,就會發現默認的頁面就會報這個錯 :see_no_evil:…… 希望 Google 能早日改正~

關於作者 :

https://github.com/barryhappy

http://www.jianshu.com/users/e4607fd59d0d

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 推酷 的精彩文章:

Akka 使用系列之四:Future
從西北市場切入,「鋼源城」聚焦上下游供應鏈服務能力
MVP的初步認識
Google Assistant 簡史,語音助手已是谷歌一個人的賽跑
為什麼你不應該再使用『var』 –Hacker Noon

TAG:推酷 |

您可能感興趣

TypeScript基礎之高級類型的可辨識聯合(Discriminated Unions)
「Good idea/solution」 類型作文審題
solidity之地址類型
python中list,array,mat,tuple大小及類型
Hibernate 映射枚舉Enum 類型的屬性
Google出品的Python代碼靜態類型分析器:Pytype
Chrome 66 新特性:CSS 類型對象模型,非同步剪貼板 API,AudioWorklet,等
python基礎之變數類型number(math模塊)
Pyright:微軟提供的Python靜態類型檢查器
「Python」Chapter1 變數和簡單數據類型
類型轉換運算符 運算符重載 operator new operator delete
opencv Mat類型和BYTE*指針類型互轉
SM、jyp、yg、cube、ymc等公司類型——其中big hit最霸氣
澳大利亞 Bunjil Place,高難度木曲線營造類型場所/fjmt
由光環新網運營的 AWS 中國區域現已推出 Amazon RDS for Oracle 支持 X1 實例類型
Redis 數據類型
Swift 類型轉換
python基礎數據類型
Kotlin 基本數據類型
Summary 數據類型詳解