研究Kotlin語言,遇到不少坑,先入為主的Java語言習(xí)慣,不由自主的陷了進(jìn)去??傆X得語言簡化了,到處都不嚴(yán)謹(jǐn),但事實(shí)上崩潰減少了,更多的事情編譯器已經(jīng)幫我們做好了。
無論如何,想突破現(xiàn)在的舒適區(qū),需要付出一定的努力。初用Kotlin真的是無從寫起,滿腔的Java,如果順利噴出,不到兩分鐘就能解決的問題。現(xiàn)在要一點(diǎn)一點(diǎn),別扭的轉(zhuǎn)化成K語言。實(shí)在不知道咋寫,就用AndroidStudio自帶的轉(zhuǎn)換器,將原有的java轉(zhuǎn)化成kotlin,慢慢學(xué)習(xí)寫法。
好吧,先說遇到的第一個(gè)小坑,就是findViewById。
這是幾乎每個(gè)Activity都會(huì)用到的方法,但是轉(zhuǎn)化成Kotlin以后,卻遇到了問題:

參看圖1,我想拿到listView里邊的引用,把Adapter放進(jìn)去,但是編譯器報(bào)錯(cuò),Type inference failed: Not enough information to infer parameter T in fun findViewById。說無法推斷出參數(shù)的具體類型,信息不足。哦哦哦,估計(jì)要我強(qiáng)轉(zhuǎn)一下吧,加上as ListView。

額,強(qiáng)轉(zhuǎn)了也不行,都明確告訴你了,也不給面子。新語言,各種不會(huì)寫,于是我使用IDE自帶的聯(lián)想功能,敲出了findViewById,可以發(fā)現(xiàn),后邊緊跟的是尖括號(hào)。

難道是kotlin的新功能嘛?本能翻進(jìn)了源碼,請(qǐng)參考圖4.

小小對(duì)比了一下,本次構(gòu)建的是新工程,使用了support-v7包,并升級(jí)到26了。老工程沒有報(bào)錯(cuò)(好吧我承認(rèn)懶得升級(jí),并且用了Java自動(dòng)轉(zhuǎn)Kotlin),但是新工程由于這個(gè)泛型的問題,轉(zhuǎn)化受到了影響。所以要將轉(zhuǎn)化的類型告訴編譯器,請(qǐng)參見圖5.

編譯運(yùn)行,通過??!完美解決問題?No.
再查資料,發(fā)現(xiàn)大伙都對(duì)findViewById這個(gè)方法比較無奈,控件稍微復(fù)雜一些,代碼行數(shù)就上去了,這也是ButterKnife火爆的原因之一。Kotlin推薦的寫法如圖6所示,一定程度上解決了findViewById占用過多行數(shù),聲明過多變量的問題。

同樣的id,命名listView_study_content,直接用這個(gè)id即可,省去了好多轉(zhuǎn)化的步驟,很方便。注意需要引入kotlinx.android.synthetic.main.your_layout.*,把layout引入,如圖7所示,就可以肆無忌憚地操作了。

小坑分享給大家,祝大伙早日習(xí)成Kotlin。