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...