坑坑洼洼的摸索了近一周Kotlin,記錄一下遇到的坑。
所有的數(shù)據(jù)類型,都要顯示轉(zhuǎn)換
//api
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
//java調(diào)用
ObjectAnimator.ofFloat(tabLayout, "alpha", 0, 1)
//kotlin調(diào)用
ObjectAnimator.ofFloat(tabLayout, "alpha", 0f, 1f)
所有的數(shù)據(jù)類型都要顯示轉(zhuǎn)換,java可以缺省,kotlin不行,會報(bào)錯(cuò)
如果語法正確的情況下報(bào)錯(cuò),可能是沒正確配置,或沒加載
簡單的,我做個(gè)跳轉(zhuǎn),java飄紅,最后發(fā)現(xiàn)是因?yàn)闆]加載全部包
另外,如果你需要其他的包,發(fā)現(xiàn)沒有,也可能是需要額外在gradle中加載,例如async
//java報(bào)錯(cuò),加載完成ok了
intent = Intent(this, RegisterActivity::class.java)
泛型
泛型可以說是最大的一個(gè)坑,但是Kotlin表示自己有理,因?yàn)閗otlin需要完全指定類類型,因此您可以指定特定類型為類型參數(shù),或者傳遞一個(gè)新的類型參數(shù)。
這里用android說話,一個(gè)java基類,泛型是可以缺省的,然而在kotlin中就不行,必須傳值,雖然kotlin提供了替代方案<*, *>,然而這是針對<T,E>這種格式的
//基類
class BaseActivity<T extends BasePresenter, E extends BaseModel>
//正確
class LoginActivity : BaseActivity<BasePresenter<*, *>, BaseModel>()
//錯(cuò)誤
class MainActivity : BaseActivity<*, *>()
也就是只要指定了泛型,就必須傳值,對于Any類型的泛型可以指定*替代,其他的必須傳,空的也行
const常量
由于越寫越多,避免冗余就單獨(dú)拉出來了
注入框架
做Android大多會用到注入框架,我之前做Android一直用的Butter Knife,最近雖說用Kotlin寫java,但查資料的時(shí)候看到了這個(gè)框架——Kotter Knife,于是很自然的想到了,Kotlin是不是不能用了,就去試了一下,報(bào)了個(gè)異常:KotlinNullPointerException
Kotter Knife說明也很簡單:View "injection" library for Android。
URL:https://github.com/JakeWharton/kotterknife
不過話說,我一般都配合生成器一起使用,剛看了一下kotlin也沒有相關(guān)生成器,語法的確簡潔一些,但也省不了多少代碼,于是還是棄用了
框架大全
https://www.kotlincn.net/docs/resources.html
擴(kuò)展函數(shù)
今天遇到個(gè)問題,找了個(gè)kotlin群,讓做個(gè)StringBuffer的擴(kuò)展函數(shù),就照貓畫虎的寫了一個(gè),想著以后可能要用到,就記下來
-
StringBuffer:表示函數(shù)的接收者,也就是函數(shù)擴(kuò)展的對象 -
.:擴(kuò)展函數(shù)修飾符 -
append:擴(kuò)展函數(shù)的名稱 -
(...):擴(kuò)展函數(shù)的參數(shù),可以為null
fun StringBuffer.append(stringBuffer: StringBuffer,string: String){
stringBuffer.append(string)
}
//然后就可以用了
val buffer = StringBuffer()
buffer.append(buffer,"123")