Type Class (類型類) 的概念來自 Haskell,表示一系列函數的集合,在概念上, Type Class 和麪向對象領域的泛型接口比較相似。編程
因爲 Haskell 是一門純函數式編程語言,沒有類和接口的概念,因此使用 Type Class 表達相似接口的概念。例如 Haskell 的 Ord 類型類在概念上和 Java 的 Comparable 很是相似。編程語言
在 Haskell 中,Type Class 使用 class
關鍵字定義:函數式編程
class BasicEq a where isEqual :: a -> a -> Bool isEqual x y = not (isNotEqual x y) isNotEqual :: a -> a -> Bool isNotEqual x y = not (isEqual x y)
Type Class Instance 則使用 instance
關鍵字定義:函數
instance BasicEq Bool where isEqual False False = True isEqual True True = True isEqual _ _ = False
只要定義了 Bool 類型的 Type Class Instance,咱們就能夠在任何地方使用 isEqual 方法比較 Bool 類型的相等性。用面向對象的語言描述就是:Bool
類型實現了 BasicEq
接口。spa
Type Class 的好處是,當系統增長一個新類型時,只須要實現該新類型的 Type Class Instance 便可,已有類型代碼能夠保持不變。scala
在面向對象領域使用接口解決相似 Type Class 的問題,例如 Java 的 Comparable 接口。可是接口的方式並不優雅,它要求新類型必須實現 Comparable 接口,若是這個新類型來自第三方庫,咱們沒法強制要求它實現 Comparable 接口。因此在面向對象領域,咱們仍然能夠借鑑 Type Class 的方式以解決接口所面臨的問題。因此 Java 提供了一個 Type Class 的等價物,即 Comparator<T>
接口,全部實現了Comparator<T>
接口的實例即爲 Type Class Instance。針對一個新類型Person
,咱們只須要實現一個Comparator<Person>
實例,便可以在任何地方對Person
集合進行排序。設計
一樣的,Scala 的核心庫設計中也採用了 Type Class 的概念。例如Ordering[T]
是一個 Type Class, IntOrdering
是一個 Type Class Instance。因此只要有IntOrdering
實例,咱們就能夠對Int類型進行排序:code
def sorted[B >: A](implicit ord : scala.math.Ordering[B])
因爲Ordering
中已經預約了常見的Type Class Instance 的隱式對象,因此咱們能夠在任何地方對常見類型進行排序。對象