2011-02-02 88 views
45

我見過「<:」和「>:」和「<%」等,有人可以給(或定位)一個很好的描述這些?什麼是可能的約束,他們做了什麼以及什麼時候使用它們的例子?確定和描述斯卡拉的泛型類型約束

+1

我喜歡這種解釋http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala/2983376#2983376 – huynhjl 2011-02-02 03:06:20

+0

可能的重複[什麼是Scala上下文和視圖邊界?] (http://stackoverflow.com/questions/4465948/what-are-scala-context-and-view-bounds) – Suma 2015-04-29 12:55:10

回答

67

S <: T意味着ST的子類型。這也被稱爲upper type bound。同樣,S >: T表示ST的超類型,lower type bound

S <% T是一個視圖綁定,並表示S必須配備view將其值映射到T類型的值。

這也讓我感到困惑,而且我有一個來自伯克利的編程語言碩士。

52

有兩種不同的東西在這裏,但他們都知道的「邊界」,而不是「限制」 ...

首先是類型範圍:

  • <: - uppper類型綁定
  • >: - 結合型低

這些是基本相同superextends在Java中,並實際上將在生成的字節碼,這是很好的互操作:)被編碼爲這樣

然後是語法糖:

  • <% - 視圖綁定
  • : - 上下文界

這些在某種程度上的Java能瞭解(儘管它們是在斯卡拉簽名表示,一個註解,SC不被編碼ALA增加了所有課程,幫助編譯器,並最終將是一個斯卡拉反射庫的基礎)

上述這些問題都轉化爲隱性參數:

def fn[A <% B](arg: A) = ... //sugared 
def fn[A](arg: A)(implicit ev: A => B) = ... //unsugared 

def fn[A : Numeric](arg: A) = ... //sugared 
def fn[A](arg: A)(implicit ev: Numeric[A]) = ... //unsugared 

出於這個原因,你可以」 t將自己的隱含與視圖邊界或上下文邊界結合起來,因爲Scala只允許爲任何函數或構造函數標記爲隱式的一個塊。

如果您確實需要使用您自己的含義,那麼您必須首先手動將任何此類邊界轉換爲未加糖的版本並將其添加到隱式塊中。