2015-11-25 69 views
0

有一些解釋here斯卡拉是什麼<<運營商

類型和對象也可以有符號名稱;特別是它應該是 提到,對於具有兩種類型參數的類型,參數之間可以寫入名稱 ,以便例如Int <:< Any<:<[Int, Any]相同。

但是,我還是不太明白。我會很感激,如果有人可以提供一個例子的解釋。

+1

對於初學者來說,這是一個類型,而不是運營商。 –

+0

[Scala標點符號(又名符號和運算符)]可能的重複](http://stackoverflow.com/questions/7888944/scala-punctuation-aka-symbols-and-operators) – emlai

+0

該帖子不討論'<: ' –

回答

1

這是在對象Predef定義的類:

abstract class <:<[-From, +To] extends Function1[From, To] 

A <:< B證人即AB一個亞型的實例。

該類名是符號沒有特別的後果,它可能已被命名爲IsSubType[From, To]又名From IsSubType To

您通過Predef.$conforms方式得到這個類的「證據」的實例:

implicit def $conforms[A]: <:<[A, A] 

的這種使用情況是你有一個類型A,但要在分型B <: A操作。然後,你可以簡單地問了這個隱含的證據:

trait Foo[A] { 
    def x: A 

    // def fails: Int = x * x -- not possible, we don't know that A is an Int 

    def succeeds(implicit ev: A <:< Int): Int = x * x 
} 

從使用現場,編譯器只允許我們叫succeeds如果A <: Int,否則我們不會將能夠獲得ev參數。由於編譯器可以基於類型參數FromTo的的方差推斷查找類型的上限,所以隱式查找是有效的。

(當然Int的是最後的類型,所以我們也可以要求平等A =:= Int,這只是有一個簡單的例子。)