2016-08-14 67 views
2

看着scala.Option[T]來源我發現了下面的隱式參數聲明implicit ev: Null <:< A1。嘗試它自己A <:<SomeType參數聲明

class Test[T](val i: Int){ 
    def test(p: T <:< Option[Int]) = 1 
} 

我發現p看起來像一個Function1。它有apply,andThen等方法。會有什麼區別,如果我們寫:

class TestMatch[T](val i: Int){ 
    def test(p: T <:< Option[Int]) = //.. 
    def test2(p: T => Option[Int]) = //... 
} 

是否存在的testtest2 singatures之間的一些主要區別?這個例子beahves是這樣的:

tm.test2(x => { //fine 
    println(x) 
    Some(x) 
}) 

tm.test(x => { //Compile error 
    println(x) 
    Some(x) 
}) 

我也試過這樣:

tm.test(x <:< { //Compile error 
    println(x) 
    Some(x) 
}) 

,但它也不能工作。如何使用test

回答

3

我發現p看起來像一個Function1

<:<被定義爲:

sealed abstract class <:<[-From, +To] extends (From => To) with Serializable 

這是派生的Function1[From, To],而這也正是你看到applyandThen來從。 <:<表示通用參數類型約束,其中TOption[Int]的子類型。

通常,<:<旨在被用作類型約束這迫使一個隱式證據是在範圍:

A <:< B證人即AB一個亞型的實例。 要求A <:< B類型的隱式參數對廣義約束A <: B進行編碼。


但不能你解釋誰創造這種隱含<:<參數? 它從哪裏來的?我猜編譯器知道有關<:<,知道 做什麼用它

在你的榜樣,沒有創建隱含的證據。您只需使用<:<作爲類型,而不是一個約束。如果你想創建一個,你需要通過聲明暗示自己做:

def greaterThan[T](x: T, y: T)(implicit ev: T <:< Ordered[T]): Boolean = x > y 
+0

但是我該如何使用'test'?有沒有辦法調用它? – stella

+0

但是'<:<'是一個函數。它在'Predef'中被定義爲''封閉的抽象類<:<[ - From,+ To] extends Serializable' – Kolmar

+0

@Kolmar仍然不會使'p'成爲Function1。它只意味着約束使用中綴表示法,它實際上定義爲'<:<[T,Option [Int]]' –

1

他們有不同的語義。在test中,您聲明TOption[Int]的子類型。在test2沒有這樣的約束。

+0

那麼如何調用'test2'?我應該通過什麼作爲參數來編譯它? – stella

相關問題