Kotlin(1.1)學習筆記(6)——泛型

in和out

和java一樣,kotlin中也有泛型的概念。不同的是苍蔬,java中使用了通配符而kotlin中不存在。本文主要介紹兩者的不同之處蝴蜓。
java中為了解決

List<String> strs = new ArrayList<String>();
List<Object> objs = strs; 

類似語句中strs復制objs報錯的問題碟绑,使用了通配符,如常見的<? extends Object>,<? super Object>茎匠;在kotlin中則要在使用泛型出outin來限定泛型是否允許插入和讀取格仲。in修飾的泛型只能寫入,out修飾的泛型只能讀取诵冒。
舉個例子:
我們定義一個copy方法凯肋,將第一個數(shù)組的內(nèi)容拷貝到第二個數(shù)組中去

val ints: Array<Int> = arrayOf(1, 2, 3)
val any = Array<Any>(3)
copy(ints, any)
錯誤示例一:
fun copy(from: Array<Any>, to: Array<Any>) {
    assert(from.size == to.size)
    for (i in from.indices)
        to[i] = from[i]
}
這里調(diào)用copy(ints, any) // 錯誤:期望 (Array<Any>, Array<Any>),

因為Array<Int>不是Array<Any>的子類汽馋,編譯器認為我們可能修改里面的信息侮东,向其中加入非Any類型的對象,所以報錯

正確示例一
fun copy(from: Array<out Any>, to: Array<Any>) {
 // ……
}

這個函數(shù)和上面那個唯一的不同就是參數(shù)from中增加了out關鍵字豹芯,它等同于java中的<? extends object>表明from這個對象是能用來做source悄雅,并讀取里面的信息,不能向內(nèi)增加數(shù)據(jù)

同樣的铁蹈,我們也可以為第二個參數(shù)增加修飾的in宽闲,等同于java中的<? super Object>,to只能接收Any以及其父類(ps:在本例中木缝,雖然可以通過編譯器便锨,但是這樣寫已經(jīng)無意義)
正確示例二

fun copy(from: Array<out Any>, to: Array<in Any>) {
 // ……
}

根據(jù)官網(wǎng)的介紹,我們可以把from稱作生產(chǎn)者我碟,to成為消費者放案。

星投影

看到這里我們已經(jīng)學到了它們的基本用法,下面來將兩個特殊的星投影

  • 對于 Foo <out T>矫俺,其中 T是一個具有上界 TUpper 的協(xié)變類型參數(shù)吱殉,Foo <*>等價于 Foo <out TUpper>。 這意味著當T 未知時厘托,你可以安全地從 Foo <*>讀取 TUpper 的值友雳。
  • 對于 Foo <in T>,其中 T是一個逆變類型參數(shù)铅匹,Foo <*> 等價于Foo <in Nothing>押赊。 這意味著當 T 未知時,沒有什么可以以安全的方式寫入Foo <*>包斑。
  • 對于 Foo <T>流礁,其中 T 是一個具有上界 TUpper 的不型變類型參數(shù)涕俗,Foo<*>對于讀取值時等價于 Foo<out TUpper>而對于寫值時等價于 Foo<in Nothing>
    如果泛型類型具有多個類型參數(shù)神帅,則每個類型參數(shù)都可以單獨投影再姑。 例如,如果類型被聲明為interface Function <in T, out U>找御,我們可以想象以下星投影:
Function<*, String> 表示 Function<in Nothing, String>元镀;
Function<Int, *> 表示 Function<Int, out Any?>;
Function<*, *> 表示 Function<in Nothing, out Any?>霎桅。

注意:星投影非常像 Java 的原始類型盾饮,但是安全及舍。

(以下內(nèi)容官網(wǎng)已經(jīng)將的很詳細义起,這里直接照抄)

泛型函數(shù)

不僅類可以有類型參數(shù)淆两。函數(shù)也可以有住闯。類型參數(shù)要放在函數(shù)名稱之前:

fun <T> singletonList(item: T): List<T> {
    // ……
}

fun <T> T.basicToString() : String {  // 擴展函數(shù)
    // ……
}

要調(diào)用泛型函數(shù)瓜浸,在調(diào)用處函數(shù)名之后指定類型參數(shù)即可:
val l = singletonList<Int>(1)

泛型約束

能夠替換給定類型參數(shù)的所有可能類型的集合可以由泛型約束限制。
上界
最常見的約束類型是與 Java 的 extends 關鍵字對應的 上界:

fun <T : Comparable<T>> sort(list: List<T>) {
    // ……
}

冒號之后指定的類型是上界:只有 Comparable<T>
的子類型可以替代T
比原。 例如

sort(listOf(1, 2, 3)) // OK插佛。Int 是 Comparable<Int> 的子類型
sort(listOf(HashMap<Int, String>())) // 錯誤:HashMap<Int,String> 不是 Comparable<HashMap<Int, String>> 的子類型

默認的上界(如果沒有聲明)是 Any?
。在尖括號中只能指定一個上界量窘。 如果同一類型參數(shù)需要多個上界雇寇,我們需要一個單獨的 where-子句:

fun <T> cloneWhenGreater(list: List<T>, threshold: T): List<T>
    where T : Comparable,
          T : Cloneable {
  return list.filter { it > threshold }.map { it.clone() }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚌铜,隨后出現(xiàn)的幾起案子锨侯,更是在濱河造成了極大的恐慌,老刑警劉巖冬殃,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囚痴,死亡現(xiàn)場離奇詭異,居然都是意外死亡审葬,警方通過查閱死者的電腦和手機深滚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涣觉,“玉大人痴荐,你說我怎么就攤上這事」俨幔” “怎么了生兆?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膝宁。 經(jīng)常有香客問我鸦难,道長栖榨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任明刷,我火速辦了婚禮婴栽,結果婚禮上,老公的妹妹穿的比我還像新娘辈末。我一直安慰自己愚争,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布挤聘。 她就那樣靜靜地躺著轰枝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪组去。 梳的紋絲不亂的頭發(fā)上鞍陨,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音从隆,去河邊找鬼诚撵。 笑死,一個胖子當著我的面吹牛键闺,可吹牛的內(nèi)容都是我干的寿烟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辛燥,長吁一口氣:“原來是場噩夢啊……” “哼筛武!你這毒婦竟也來了?” 一聲冷哼從身側響起挎塌,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤徘六,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后榴都,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體待锈,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年缭贡,在試婚紗的時候發(fā)現(xiàn)自己被綠了炉擅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡阳惹,死狀恐怖谍失,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莹汤,我是刑警寧澤快鱼,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響抹竹,放射性物質(zhì)發(fā)生泄漏线罕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一窃判、第九天 我趴在偏房一處隱蔽的房頂上張望钞楼。 院中可真熱鬧,春花似錦袄琳、人聲如沸询件。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宛琅。三九已至,卻和暖如春逗旁,著一層夾襖步出監(jiān)牢的瞬間嘿辟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工片效, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留红伦,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓堤舒,卻偏偏與公主長得像色建,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子舌缤,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 人生苦多,快來 Kotlin 某残,快速學習Kotlin国撵! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,201評論 9 118
  • 系列文章全部為本人的學習筆記玻墅,若有任何不妥之處介牙,隨時歡迎拍磚指正。如果你覺得我的文章對你有用澳厢,歡迎關注我环础,我們一起...
    我愛吃栗子啊閱讀 6,736評論 5 14
  • 大家好,我是William李梓峰剩拢,歡迎加入我的Kotlin學習之旅线得。今天是我學習 Kotlin 的第十五天,內(nèi)容是...
    William李梓峰閱讀 1,889評論 -1 1
  • 今天前輩交給我了一個任務徐伐,把領導簽好字的文件蓋上戳贯钩,掃描出來。我就蓋啊,掃啊角雷,后來我?guī)煾蹈艺f蓋章要蓋正祸穷,從蓋章就...
    豆芽王子閱讀 459評論 0 0
  • 鏡中 只要想起一生中后悔的事 梅花便落了下來 比如看她游泳到河的另一岸 比如登上一株松木梯子 危險的事固然美麗 不...
    神經(jīng)質(zhì)的喵小姐閱讀 1,044評論 0 1