Kotlin泛型的使用介紹
1.泛型類、泛型函數(shù)
1)泛型類可以接收任意類型。Package<T>(t: T)
2)泛型類中定義的泛型參數(shù)<T>,通常用T(Type)表示,(t: T) 這個表示泛型類Package的主構(gòu)造函數(shù)可以接收T類型的屬性。
3)openPackage(): T定義一個返回T類型的泛型函數(shù)。
4)fun <R> getProductName(block: (T) -> R): R getProductName的返回值是R(英文的Return),接收一個匿名函數(shù)為參數(shù)block: (T) -> R,這個匿名函數(shù)的參數(shù)是T,返回值是R。也就是說,匿名函數(shù)的返回值,就是getProductName的返回值。這個和前面講到的apply、let、run、with等是一樣的多參數(shù)函數(shù)。
//泛型類
class Package<T>(t: T) {
private val product: T = t
//泛型函數(shù)
fun openPackage(): T {
return product
}
//多參數(shù)泛型函數(shù)
fun <R> getProductName(block: (T) -> R): R {
return block(product)
}
}fun main() {
val pkg = Package(Phone("IPhone"))
println(pkg.openPackage())
println(pkg.getProductName {
it.name
})
val pkg2 = Package(Fruit("Apple"))
println(pkg2.openPackage())
println(pkg2.getProductName {
it.name
})
}2.泛型類型約束。上面的泛型類,可以接收任意類型。如果我們只想某個類接收特定類型的,可以使用泛型約束。
1)定義一個父類Fruit和兩個子類,Apple和Banana
open class Fruit(val name:String){
}
class Apple(name:String) : Fruit(name){
}
class Banana(name:String):Fruit(name){
}2)定義泛型類約束:<T:Fruit> 表示只能接收Fruit類或子類。和Java中的<? extends Fruit>作用是一樣的。
Kotlin中定義泛型約束
class Package<T:Fruit>(t: T) {
private val product: T = t
fun openPackage(): T {
return product
}
fun <R> getProductName(block: (T) -> R): R {
return block(product)
}
}
fun main() {
//定義了泛型約束的類,只能放Fruit的子類
val pkg = Package(Apple("apple"))
val pkg2 = Package(Banana("banana"))
//Phone類型是放不進(jìn)去的
val pkg3 = Package(Phone("Iphone"))
}Java中定義泛型約束
public class Package<T extends Fruit> {
public T t;
public Package(T t) {
this.t = t;
}
public T openPackage() {
return t;
}
}3.泛型類接收的參數(shù)也可以是一個集合:
class Package<T:Fruit>(list:List<T>) {
var list = list
fun get(index:Int):Fruit = list[index]
}vararg items: T 就表示可以存放多個。vararg就是對應(yīng)java中的可變參數(shù)。可以用一個數(shù)組來接收它Array<out T> ,這里的out 就是協(xié)變的意思。表示,可以就收該類或該類的子類。
class Package<T : Fruit>(vararg items: T) {
var itmes: Array<out T> = items
operator fun get(index: Int): Fruit = itmes[index]
}fun main() {
val p = Package22(listOf(Apple("apple")))
println(p.get(0))
val p2 = Package(Apple("apple"))
println(p2[0])
}4.協(xié)變out,逆變in
out T 對應(yīng)java中的 ?extend T
int T 對應(yīng)java中的?super T
5.類型擦除
對應(yīng)java和Kotlin,泛型都值存在于編譯期,運(yùn)行后,就不存在泛型的概念,而是指定類型。
如果我們想要檢查所傳入泛型的類型,在kotlin中可以使用reified 關(guān)鍵字。在Java中可以通過反射的方式,來獲取泛型的類型。
到此這篇關(guān)于Kotlin泛型的使用介紹的文章就介紹到這了,更多相關(guān)Kotlin泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android開發(fā)實(shí)現(xiàn)瀏覽器全屏顯示功能
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)瀏覽器全屏顯示功能,涉及Android布局修改及相關(guān)屬性動態(tài)設(shè)置操作技巧,需要的朋友可以參考下2017-09-09
android調(diào)用原生圖片裁剪后圖片尺寸縮放的解決方法
這篇文章主要為大家詳細(xì)介紹了android調(diào)用原生圖片裁剪后圖片尺寸縮放的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
實(shí)例分析Android中HandlerThread線程用法
本篇文章主要給大家介紹了Android HandlerThread使用介紹以及源碼解析,有需要的朋友參考學(xué)習(xí)下吧。2017-12-12
學(xué)習(xí)Android開發(fā)之RecyclerView使用初探
Android開發(fā)學(xué)習(xí)之路的第一課RecyclerView使用初探,感興趣的小伙伴們可以參考一下2016-07-07
很贊的引導(dǎo)界面效果Android控件ImageSwitcher實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android控件ImageSwitcher如何實(shí)現(xiàn)很贊的引導(dǎo)界面的具體代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
淺析Android App的相對布局RelativeLayout
這篇文章主要介紹了Android App的相對布局RelativeLayout,文中舉了一個登錄界面的XML布局例子,非常直觀,需要的朋友可以參考下2016-04-04
詳解Android中實(shí)現(xiàn)ListView左右滑動刪除條目的方法
這篇文章主要介紹了Android中實(shí)現(xiàn)ListView左右滑動刪除條目的方法,文中分別展示了通過Scroller和NineOldAndroids來實(shí)現(xiàn)的例子,需要的朋友可以參考下2016-04-04
解析Android中string-array數(shù)據(jù)源的簡單使用
本篇文章是對Android中string-array數(shù)據(jù)源的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Android進(jìn)階Hook攔截系統(tǒng)實(shí)例化View過程實(shí)現(xiàn)App換膚功能
這篇文章主要為大家介紹了Android進(jìn)階Hook攔截系統(tǒng)實(shí)例化View過程實(shí)現(xiàn)App換膚功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android Studio開發(fā)環(huán)境搭建教程詳解
android studio是最近比較火的開發(fā),那么android studio開發(fā)環(huán)境怎么搭建呢?下面通過本文給大家記錄下Android Studio開發(fā)環(huán)境搭建教程詳解,需要的朋友參考下吧2017-11-11

