Scala 類型系統(tǒng)

協(xié)變 Covariance

https://docs.scala-lang.org/zh-cn/tour/variances.html

在期望接收一個基類(父類) 實例的集合的地方,能夠使用一個子類實例的集合的能力叫做協(xié)變曙搬。

//基類
var objects: List[Any] = null;
//子類
val ints = List(1,2,3,4)

objects = ints //scala 會編譯錯誤

如上面的代碼赞别,將 int 數(shù)據(jù)類型的集合賦值給 Any 類型的集合制圈,就是協(xié)變。

Scala 的 List[+T] 支持協(xié)變

逆變 Contravariance

在期望接收一個子類實例的集合的地方,能夠使用一個基類(父類) 實例的集合的能力叫做逆變休里。

//子類
var ints: List[Int] = null;
//基類
val objects = List("3","4")

ints = objects //scala 會編譯錯誤

如上面的代碼富腊,將 objects 父類數(shù)據(jù)類型的集合賦值給 int 類型的集合坏逢,就是逆變。
Scala 的 List[+T] 不支持逆變

如何支持協(xié)變 -- 協(xié)變定義上界

定義 Pet 和 Dog

case class Pet(name: String)

case class Dog(name:String) extends Pet(name)

有一個接收 List[Pet] 的方法

def doPets(pets: List[Pet]) = {
//xxxx
}

如果使用 List[Dog] 的集合傳入該方法會報編譯錯誤赘被,如果想讓該方法支持協(xié)變是整,則可以像如下方法定義:

def doPets[T <: Pet](pets: List[T]) {
  // xxxx
}

T <: Pet 表明由 T 表示的類派生自 Pet 類,也即 T 為 Pet 的子類民假。這個語法定義了一個上界浮入。Pet 為 T 的上界,即往父類方向坐了限制羊异。

如何支持逆變 -- 逆變定義下界

  //逆變,限制了下界, T 必須為 Apple 或其超類
  def writeTo[T >: Apple](apples: List[T]): Unit = {
  }

逆變會決定下界舵盈,然后你可以在上述的 apples 中添加 Apple 或其父類。

PECS 原則

《Effective Java》給出精煉的描述:producer-extends, consumer-super(PECS)球化。

  • 協(xié)變限制數(shù)據(jù)來源,生產(chǎn)者秽晚,保證生產(chǎn)的產(chǎn)品為 T 或其子類。
  • 逆變限制數(shù)據(jù)消費筒愚,保證用來消費的數(shù)據(jù)必須時 T 或其父類赴蝇。
  //copy方法限制了拷貝源src必須是T或者是它的子類,
  // 而拷貝目的地dest必須是T或者是它的父類巢掺,這樣就保證了類型的合法性句伶。
  def copy[S, D >: S](src: List[S], dest: List[D]): Unit = {

  }
  • copy 方法,限制 src 來源必須是 S 及其子類陆淀,限制 dest 是 S及其父類考余,這樣才能去接收。

在scala泛型中獲取其 Class[T]

需求:獲取一個泛型 T 的 class 類型的 Class[T],有兩種方法轧苫。

獲取方式1

def getClassT[T](obj: T): Class[T] = {
        val res = obj.getClass.asInstanceOf[Class[T]]
        res
}

更優(yōu)雅的獲取方式

def getClassT[T](obj: T)(implicit m: Manifest[T]): Class[T] = {
        val res: Class[T] = m.runtimeClass.asInstanceOf[Class[T]]
        res
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楚堤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌身冬,老刑警劉巖衅胀,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酥筝,居然都是意外死亡滚躯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門嘿歌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掸掏,“玉大人,你說我怎么就攤上這事宙帝∩シ铮” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵茄唐,是天一觀的道長。 經(jīng)常有香客問我蝇更,道長沪编,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任年扩,我火速辦了婚禮蚁廓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厨幻。我一直安慰自己相嵌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布况脆。 她就那樣靜靜地躺著饭宾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪格了。 梳的紋絲不亂的頭發(fā)上看铆,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音盛末,去河邊找鬼弹惦。 笑死,一個胖子當(dāng)著我的面吹牛悄但,可吹牛的內(nèi)容都是我干的棠隐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼檐嚣,長吁一口氣:“原來是場噩夢啊……” “哼助泽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤报咳,失蹤者是張志新(化名)和其女友劉穎侠讯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暑刃,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡厢漩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了岩臣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溜嗜。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖架谎,靈堂內(nèi)的尸體忽然破棺而出炸宵,到底是詐尸還是另有隱情,我是刑警寧澤谷扣,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布土全,位于F島的核電站,受9級特大地震影響会涎,放射性物質(zhì)發(fā)生泄漏裹匙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一末秃、第九天 我趴在偏房一處隱蔽的房頂上張望概页。 院中可真熱鬧,春花似錦练慕、人聲如沸惰匙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽项鬼。三九已至,卻和暖如春劲阎,著一層夾襖步出監(jiān)牢的瞬間秃臣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工哪工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奥此,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓雁比,卻偏偏與公主長得像稚虎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子偎捎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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