Scala類(lèi)型系統(tǒng)之: 類(lèi)型變量界定趾徽、視圖界定、上下文界定

類(lèi)型變量界定(Type Variable Bound)翰守、視圖界定(View Bound)孵奶、上下文界定(Context Bound),在scala中算很重要的內(nèi)容了蜡峰,這次博客就來(lái)寫(xiě)點(diǎn)自己的理解了袁。

1、類(lèi)型變量界定(Type Variable Bound):

1.  // 編譯錯(cuò)誤  
2.  def typeVariable[T](a: T, b: T) = {  
3.  if (a.compareTo(b) > 0) 1  
4.  else -1  
5.  }  

7.  // 通過(guò)編譯  
8.  def typeVariable[T <: Comparable[T]](a: T, b: T) = {  
9.  if (a.compareTo(b) > 0) 1  
10.  else -1  
11.  }  

在上面的例子中湿颅,我們?yōu)榉缎蚑增加了約束载绿,限定上界為Comparable[T],這樣一來(lái)油航,范型類(lèi)型T也就具有了Comparable[T]中的compareTo(T)方法卢鹦,類(lèi)似于java中的繼承。

2劝堪、視圖界定(View Bound):

1.  def typeVariable[T <: Comparable[T]](a: T, b: T) = {  
2.  if (a.compareTo(b) > 0) 1  
3.  else -1  
4.  }  

這是我們剛剛通過(guò)編譯的代碼冀自,接著我們運(yùn)行一下:

1.  val v1 = typeVariable("scala", "java")  
2.  println(v1) // scala  

運(yùn)行結(jié)果為:scala,但是秒啦,如果我們輸入數(shù)字的話(huà)熬粗,便會(huì)報(bào)錯(cuò):

1.  val v2 = typeVariable(100, 200)  
2.  println(v2)  
3.  Error:(15, 12) inferred type arguments [Int] do not conform to method typeVariable's type parameter bounds [T <: Comparable[T]]  
4.  val v2 = typeVariable(100, 200)  
5.  ^  

因?yàn)槲覀兊腎nt類(lèi)型并沒(méi)有遵循我們的范型約束。如果我們此時(shí)想成功運(yùn)行的話(huà)余境,就需要進(jìn)行一次隱式轉(zhuǎn)換驻呐,將Int類(lèi)型轉(zhuǎn)換成支持Comparable[T]的類(lèi)型灌诅,那么,我們的視圖界定便能出場(chǎng)了:

1.  def typeVariable[T <% Comparable[T]](a: T, b: T) = {  
2.  if (a.compareTo(b) > 0) a  
3.  else b  
4.  }  
5.  val v2 = typeVariable(100, 200)  
6.  println(v2) // 200  

從代碼中發(fā)現(xiàn)含末,范型限定時(shí)猜拾,我們將"<:"改為了"<%",這樣佣盒,原本的類(lèi)型變量界定就轉(zhuǎn)換成了視圖界定挎袜,而視圖界定幫我們進(jìn)行了隱式轉(zhuǎn)換,將Int轉(zhuǎn)換成了支持Comparable[T]的RichInt類(lèi)型肥惭。

<u style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; overflow-wrap: break-word;">編寫(xiě)代碼時(shí)盯仪,"<%"的限定較為寬松,不僅繼承了Comparable[T]的類(lèi)能夠順利運(yùn)行蜜葱,而且通過(guò)隱式轉(zhuǎn)換而來(lái)的繼承Comparable[T]的類(lèi)也能夠順利運(yùn)行</u>全景。

3、上界(Upper Bound)牵囤、下界(Lower Bound):

有上界爸黄,那么也有下界,上界我們用"<:"來(lái)表示揭鳞,例如:A <: B馆纳,表示B為A的上界,在java中即A繼承B汹桦。

下界用">:"來(lái)表示鲁驶,例如A >: B,表示B為A的下界舞骆,此時(shí)B繼承A钥弯。

4、上下文界定(Context Bound):

上下文界定的類(lèi)型參數(shù)形式為T(mén):M的形式督禽,其中M是一個(gè)泛型類(lèi)脆霎,這種形式要求存在一個(gè)M[T]類(lèi)型的隱式值:

1.  class Person(val age: Int) {  
2.  println("person==> " + age)  
3.  }  

5.  // PersonOrdering繼承了Ordering[T],而Ordering[T]又繼承了Comporator[T]狈惫,所以下面方法中有compare(x: T, y: T)方法  
6.  class PersonOrdering extends Ordering[Person] {  
7.  override def compare(x: Person, y: Person): Int = {  
8.  if (x.age > y.age) 1 else -1  
9.  }  
10.  }  

12.  // 該類(lèi)定義了一個(gè)上下文界定睛蛛,意思是  
13.  // 在其作用域內(nèi),必須有一個(gè)Ordering[T]的隱式值胧谈,而這個(gè)隱式值可以作用于內(nèi)部的方法  
14.  class Pair[T: Ordering](val first: T, val second: T) {  
15.  // 該方法需要一個(gè)類(lèi)型為Ordering[T]的隱式參數(shù)  
16.  def old(implicit ord: Ordering[T]) = {  
17.  if (ord.compare(first, second) > 0) first else second  
18.  }  
19.  }  

21.  // 定義一個(gè)隱式值忆肾,類(lèi)型為Ordering[T]  
22.  implicit val po = new PersonOrdering  
23.  val p = new Pair(new Person(18), new Person(19))  
24.  // 調(diào)用old方法時(shí),不需要傳入?yún)?shù)菱肖,根據(jù)我們的上下文界定要求客冈,po滿(mǎn)足要求,因此作為參數(shù)傳入old  
25.  println(p.old.age) // 19  

這次的博客雖然是說(shuō)界定稳强,但是也扯到了不少的隱式轉(zhuǎn)換场仲,所以需要對(duì)scala有一些基本的了解和悦,另外文章中如果有出錯(cuò)的地方,歡迎指正渠缕。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸽素,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子亦鳞,更是在濱河造成了極大的恐慌馍忽,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚜迅,死亡現(xiàn)場(chǎng)離奇詭異舵匾,居然都是意外死亡俊抵,警方通過(guò)查閱死者的電腦和手機(jī)谁不,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)徽诲,“玉大人刹帕,你說(shuō)我怎么就攤上這事』烟妫” “怎么了偷溺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钱贯。 經(jīng)常有香客問(wèn)我挫掏,道長(zhǎng),這世上最難降的妖魔是什么秩命? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任尉共,我火速辦了婚禮,結(jié)果婚禮上弃锐,老公的妹妹穿的比我還像新娘袄友。我一直安慰自己,他們只是感情好霹菊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布剧蚣。 她就那樣靜靜地躺著,像睡著了一般旋廷。 火紅的嫁衣襯著肌膚如雪鸠按。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天饶碘,我揣著相機(jī)與錄音待诅,去河邊找鬼。 笑死熊镣,一個(gè)胖子當(dāng)著我的面吹牛卑雁,可吹牛的內(nèi)容都是我干的募书。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼测蹲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼莹捡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起扣甲,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤篮赢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后琉挖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體启泣,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年示辈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寥茫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矾麻,死狀恐怖纱耻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情险耀,我是刑警寧澤弄喘,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甩牺,受9級(jí)特大地震影響蘑志,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贬派,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一急但、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赠群,春花似錦羊始、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至冬三,卻和暖如春匀油,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勾笆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工敌蚜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窝爪。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓弛车,卻偏偏與公主長(zhǎng)得像齐媒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纷跛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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