- 泛型類型參數(shù)
- 類型參數(shù)要么被顯示的聲明出來,要么可以推導(dǎo)(和Java不同)
- 函數(shù)聲明
fun <T> List<T>.slice(indices: IntRange): List<T>
- 擴(kuò)展屬性
val <T> List<T>.penultimate: T
get() = this.[size - 2]
class StringList: List<String> { //確定了類型都是String
override fun get(i: Int) : String {...}
}
class ArrayList<T>: List<T>{
override fun get(i: Int) : T {...}
}
<T extend Type> //java
<T: Type> // kotlin
//kotlin特有的多個(gè)上界約束
fun <T> foo(p: T) where T: Type1,T: Type2{ ... } //T必須是Type1和Type2的子類或?qū)崿F(xiàn)類
<T> == <Any?> //所以類型可為null
<T:Any> // 這樣就不能為null了
- 運(yùn)行時(shí)類型擦除
value is List<String> // error,現(xiàn)在的value是List
value is List<*> // pass
- 用inline函數(shù)實(shí)現(xiàn)對泛型的檢查
inline fun <reified T> isA (value: Any) = value is T
// Kotlin 自帶函數(shù)
list.filterIsInstance<T>() // 過慮為T類型的數(shù)據(jù)
- 帶reified的inline函數(shù)不能在Java中調(diào)用
- 變型
見P250
kt: <out T> ~= java :<? extends T> //只做生成類型,kotlin叫協(xié)變
kt: <in T> ~= java :<? super T> //只做消費(fèi)類型,kotlin叫逆變
- 點(diǎn)變 P254
書上大概說的是: <out T>可讀不可變可作為方法的返回值<in T>可變不讀可作為方法是參數(shù)
- <*> == <?>