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 數據類型詳解