scala 泛型 屆定 約束

2021-10-24 01:13:25 字數 2222 閱讀 1847

package com.

self

.study

import scala.reflect.classtag

class genericity

// 泛型, 中括號f \ s \ t 都表示執行時引數型別

// classtag[f]儲存了泛型擦除後的原始型別f, 提供給被執行時的

class triple[f: classtag, s, t]

(val first: f,

val second: s,

val third: t)

}object hellotypeparam

}// 泛型型別限定符, 表示只限定comparable子類

// comparable[t]: 為t上屆, t: 為comparable[t]下屆

class pair[t <

: comparable[t]](

val first: t,

val second: t)

// 宣告帶t泛型引數的類

class pair_lower_bount[t]

(val first: t,

val second: t)

// <% 泛型試圖屆定符, 表示把傳入不是comparable[t]型別的 隱式傳換 為comparable[t]型別 它比<:適用的範圍更廣,除了所有的子型別, 還允許隱式轉換過去的型別

// comparable[t]: 為t上屆, t: 為comparable[t]下屆

class pairnotperfect[t <

% comparable[t]](

val first: t,

val second: t)

// 上下文界定

class pairordering[t: ordering]

(val first: t,

val second: t)

object contextbounds

}// manifest關鍵字: 陣列在宣告時必須要求指定具體的型別, 在函式泛型是無法知道具體型別

// 通過manifest關鍵字使得執行時可以根據這個manifest引數做更多的事情

object manifesttest

arraymake(1,

2).foreach(println)}}

// classtag關鍵字: 儲存了泛型擦除後的原始型別t, 提供給被執行時的, 感覺跟manifest同等效果

// classmanifest關鍵字: 在引入manifest的時候, 還引入了乙個更弱一點的classmanifest

// 所謂的弱是指型別資訊不如manifest那麼完整. 用typetag替代了manifest, 用classtag替代了

// classmanifest, 原因是在路徑依賴型別中, manifest存在問題

object classmanifesttest

}// 多重屆定(邊界確定)符

// t <: a with b => a和b為t的上屆

// t >: a with b => a和b為t的下屆

// < 或 > 口在哪邊, 哪邊就是上屆; 上下界可以通過族譜來看, 上屆是位於上層的父輩, 下屆是位於下層的子輩

// t >: a <: b => 同時擁有上屆和下屆, 並切a為下屆, b為上屆, a為b的子類, 順序不能顛倒

// 以上是泛型中的型別屆定

// t : a : b => 上下文屆定, 同時滿足a[t]這種隱式值和b[t]這種隱式值

// t <% a <% b => 試圖屆定, 即同時能滿足隱式轉換的a和隱式轉換的b 它比<:適用的範圍更廣,除了所有的子型別, 還允許隱式轉換過去的型別

// scala型別約束

// a =:= b 表示a型別等同於b型別

// a <:< b 表示a型別是b型別的子類

object scalatypeconstraint

rocky(

"spark")}

}// 協變[+t]與逆變[-t]

// 協變[+t]: 指能夠使用與原始指定的派生型別相比,派生程度更大(子=>父類)的型別。e.g. string => anyref,

// 逆變[-t]: 指能夠使用派生程度更小(父=>子類)的型別。e.g. anyref => string

scala 18 泛型和泛型約束

上下界 bounds 檢視界定 view bounds 上下文界定context bounds manifest和classtag關鍵字 多重界定 scala型別約束 def getmiddle arr array int arr arr.length 2 def main args array s...

c 泛型約束

在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定的。下表列出了六種型別的約束 約束說明 t struct 型別引數必須是值型別。可以指定除...

泛型型別約束

where 泛型型別約束 c 參考 visual studio 2015 其他版本 在泛型型別定義中,where 子句用於指定對下列型別的約束 這些型別可用作泛型宣告中定義的型別引數的實參。例如,可以宣告乙個泛型類 mygenericclass,這樣,型別引數 t 就可以實現 icomparable...