泛型碾牌、型變與投影

簡(jiǎn)單泛型

kotlin 對(duì)于簡(jiǎn)單泛型的支持與java類似, 可以通過通配符思灰,提升代碼的靈活度

data class Response<T>(val code: Int, var body: T) { }/定義了一個(gè)泛型類

限定型泛型

在編碼實(shí)踐中玷犹,通常來說只使用簡(jiǎn)單的通配符來增加自由度,我們也需要用到限定性泛型洒疚,可以通過where關(guān)鍵字來約束自由度

interface callback<in T> 
       where T : Response<Any> { //T 必須是Response類型
   fun onSuccess(response: T)
   fun onFailed()
}

泛型的通配符邊界

先說明一個(gè)java 中泛型的通配符邊界的預(yù)備知識(shí):

1 . ? extends T叫做上界通配符歹颓,用來表示所有T類型及其子類型坯屿。例如List<? extends Number>List<Integer>的超類。

ArrayList<? extends Number> list=new ArrayList<Integer>(); //  ? extends Number :可以接收所有Number的子類

list.add(Integer(1));  //會(huì)報(bào)錯(cuò),因?yàn)榫幾g器并無法了解該超類(? extends Number)泛型的實(shí)現(xiàn)類(Integer)的類型巍扛。

Number number=list.get(0) //不會(huì)報(bào)錯(cuò)领跛。
  1. 由上述代碼可以看出, ? extends T是可取不可存的——入?yún)⒅兄灰霈F(xiàn)T類型的函數(shù)撤奸,都不可被訪問吠昭。

  2. ? super T叫做下界通配符,用阿里表示所有T類型及其超類胧瓜。例如List<? super Number>List<Object>的超類矢棚,

ArrayList<? super Integer> list=new ArrayList<Object>();
Object a= list.get(0)  //? super 在取值時(shí)只能是Object
list.add(1); //在存值時(shí)不會(huì)有影響。
  1. 由上述代碼可以看出府喳, ? super T是可存不可取——返回值中是T類型的函數(shù)幻妓,都不可被訪問。
PECS原則:
  - 頻繁往外讀取內(nèi)容的劫拢,適合用上界Extends肉津。
  - 經(jīng)常往里插入的,適合用下界Super

kotlin中使用 in 舱沧、 out妹沙、*表示 通配符邊界

當(dāng)我們表示一個(gè)受限制的類型時(shí),我們稱它為類型投影熟吏, 它只能用于對(duì)類與接口的聲明距糖。所謂投影,可以理解是實(shí)際類型對(duì)泛型類型的映射, 而嚴(yán)格的限制帶來了帶來安全性:

  1. in T 代表只支持入?yún)?/code>牵寺,T類型作為類型的下界悍引,

    Array<in String>對(duì)應(yīng)于 Java 的 Array<? super String>可以接受 CharSequence 類型或者 Object 類型

  2. out T 代表只支持出參,T類型作為類型的上界
    Array<out Number>對(duì)應(yīng)于 Java 的 Array<? extends Number>可以接受 Integer 類型或者 Double 類型 帽氓。

當(dāng)我們不希望對(duì)出參趣斤、入?yún)⑦M(jìn)行限制,只希望所有具體的實(shí)例化都是該泛型的子類黎休。(還記得ArrayList<String> 不是ArrayList<Object>的子類嗎)浓领,Kotlin提供了*投影解決此問題

  1. *投影 可以不受類型的限制,對(duì)于<out T>來說势腮,*投影 相當(dāng)于<out Any>; 而對(duì)于<in T>來說联贩,*投影相當(dāng)于<in Nothing>

    // TODO

簡(jiǎn)單泛型的擴(kuò)展

kotlin支持針對(duì)泛型的擴(kuò)展,比如給每個(gè)Logger添加一個(gè)code解析方法:

interface logger {
    fun log(tag: String, value: String)
}

class MyLogger : logger {
    override fun log(tag: String, value: String) {
        System.out.println("$tag  do $value")  
    }
}

fun <T> T.write(text: String): Unit where  T : logger { //針對(duì)所有l(wèi)ogger添加擴(kuò)展
    this.log("test", "write $text") 
}

fun main(args: Array<String>) {
    var log: MyLogger = MyLogger()
    log.write("doulala") //print  "test  do write doulala"
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捎拯,隨后出現(xiàn)的幾起案子泪幌,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祸泪,死亡現(xiàn)場(chǎng)離奇詭異吗浩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浴滴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門拓萌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岁钓,“玉大人升略,你說我怎么就攤上這事÷畔蓿” “怎么了品嚣?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钧大。 經(jīng)常有香客問我翰撑,道長(zhǎng),這世上最難降的妖魔是什么啊央? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任眶诈,我火速辦了婚禮,結(jié)果婚禮上瓜饥,老公的妹妹穿的比我還像新娘逝撬。我一直安慰自己,他們只是感情好乓土,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布宪潮。 她就那樣靜靜地躺著,像睡著了一般趣苏。 火紅的嫁衣襯著肌膚如雪狡相。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天食磕,我揣著相機(jī)與錄音尽棕,去河邊找鬼。 笑死彬伦,一個(gè)胖子當(dāng)著我的面吹牛萄金,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播媚朦,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼氧敢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了询张?” 一聲冷哼從身側(cè)響起孙乖,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后唯袄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弯屈,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年恋拷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了资厉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔬顾,死狀恐怖宴偿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诀豁,我是刑警寧澤窄刘,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站舷胜,受9級(jí)特大地震影響彩库,放射性物質(zhì)發(fā)生泄漏卵酪。R本人自食惡果不足惜辱魁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一喧枷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沮焕,春花似錦吨岭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至空入,卻和暖如春络它,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歪赢。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工化戳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埋凯。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓点楼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親白对。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掠廓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 前言 人生苦多,快來 Kotlin 甩恼,快速學(xué)習(xí)Kotlin蟀瞧! 什么是Kotlin沉颂? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,211評(píng)論 9 118
  • 前言 泛型(Generics)的型變是Java中比較難以理解和使用的部分铸屉,“神秘”的通配符,讓我看了幾遍《Java...
    珞澤珈群閱讀 7,851評(píng)論 12 51
  • 第8章 泛型 通常情況的類和函數(shù)切端,我們只需要使用具體的類型即可:要么是基本類型彻坛,要么是自定義的類。但是在集合類的場(chǎng)...
    光劍書架上的書閱讀 2,150評(píng)論 6 10
  • 標(biāo)簽: Kotlin 本文聲明:本文由Coder-pig編寫踏枣,想了解其他內(nèi)容昌屉,可見【Coder-Pig的豬欄】尊重...
    coder_pig閱讀 632評(píng)論 3 3
  • 互聯(lián)網(wǎng)發(fā)展至今,經(jīng)歷了幾個(gè)劃時(shí)代的產(chǎn)物椰于,2000年前后怠益, 新浪仪搔、搜狐作為中國第一代互聯(lián)網(wǎng)的門戶席卷了中國大地瘾婿;20...
    bigParis閱讀 379評(píng)論 0 1