泛型
泛型的使用是為了程序有更好的擴(kuò)展性。
泛型類和泛型方法
class MyClass<T> {
fun <T>method(param:T):T{
return param
}
}
泛型的高級特性
java的泛型是通過類型擦除機(jī)制來實現(xiàn)的,什么事類型擦除機(jī)制,就是說泛型對于類型的約束只在編譯時期存在,運行時,JVM是識別不了我們在代碼中指定的泛型類型的。
泛型實化
Kotlin也是基于JVM上的語言,所以同樣存在類型擦除機(jī)制。但是Kotlin中有一個內(nèi)聯(lián)函數(shù),這個是用代碼替換的方式的原理實現(xiàn)的,所以避免了類型擦除機(jī)制,從而可以通過T::class.java來知道泛型是具體什么類型的。這里有個泛型實化必須添加的關(guān)鍵字reified
inline fun <reified T> getGenericType()=T::class.java
fun main(){
val result1= getGenericType<String>()
val result2= getGenericType<Int>()
println(result1)
println(result2)
}
泛型實化的應(yīng)用
inline fun <reified T>startActivity(context: Context){
val intent=Intent(context,T::class.java)
context.startActivity(intent)
}
inline fun <reified T>startActivity(context: Context,block:Intent.()->Unit){
val intent=Intent(context,T::class.java)
intent.block()
context.startActivity(intent)
}
startActivity<TestActivity>(this)
startActivity<TestActivity>(this){
putExtra("param1","1")
putExtra("param2","2")
}
泛型的協(xié)變
官方一點的描述,A是B的子類型,MyClass<A>又是MyClass<B>的子類型。那么我們就可以稱MyClass在T這個泛型上是協(xié)變的。
通俗的話來說MyClass中的數(shù)據(jù)是只讀就可以避免類型轉(zhuǎn)換異常,比如下面這個方法,只有g(shù)et方法,并且只能通過構(gòu)造函數(shù)來設(shè)置初始化值。注意關(guān)鍵字out
class SimpleData<out T>(val data:T){
fun get():T{
return data
}
}
協(xié)變在kotlin中的應(yīng)用就是List
泛型的逆變
官方描述:A是B的子類型,MyClass<B>又是MyClass<A>的子類型,那么我們稱MyClass在T這個泛型上是逆變的
用通俗的話來說A里面的屬性就是B里面的屬性,規(guī)定了不會類型轉(zhuǎn)換異常,注意關(guān)鍵字in這個和協(xié)變是相反的。
interface Transformer<in T>{
fun transform(t:T):String
}
委托
類委托
簡單來說就是自己寫的類,里面的一些方法在別的類已經(jīng)有現(xiàn)成的寫好了,直接用他的方法就可以了。和繼承還有點點區(qū)別,委托只是取自己想要的方法就可以了。
class Myset<T>(val hashSet: HashSet<T>):Set<T>{
override val size: Int
get() = hashSet.size
override fun contains(element: T): Boolean {
return hashSet.contains(element)
}
override fun containsAll(elements: Collection<T>): Boolean {
return hashSet.containsAll(elements)
}
override fun isEmpty(): Boolean {
return hashSet.isEmpty()
}
override fun iterator(): Iterator<T> {
return hashSet.iterator()
}
}
這就是把MySet的實現(xiàn)方法交給了HashSet的對象來實現(xiàn)了,自己沒有具體的實現(xiàn)方法,這個就是委托。
優(yōu)化,每次都要寫這種格式化的轉(zhuǎn)接方法比較麻煩,kotlin提供了by關(guān)鍵字。具體實現(xiàn)如下,這就代表了上面這段代碼。
class MySet2<T>(val hashSet: HashSet<T>):Set<T>by hashSet
屬性委托
lazy函數(shù)