2017-10-08 25 views
3

如下面的代碼。Scala中的「T =:= Int = null」是什麼意思?

class A[T] { 
    def add(n: Int)(implicit env: T =:= Int = null): Int = n + 1 
} 

object A extends App { 
    val a = new A[Int] 
    a.add(1) // 2 
} 

我知道T =:= Int意味着T應該Int型的,但到底是什麼= null部分是什麼意思?


注意:這個例子是我做的了。如果你不能正確使用= null,那會更好。

回答

6

null只是將默認值分配給ev,就像您對其他任何參數一樣。 這是要找出一個聰明的方法類型是否實際上是一個Int

def isInt[T](implicit ev: T =:= Int = null): Boolean = env != null 

isInt[Int] // true 
isInt[String] // false 

訣竅是,當編譯器看到的Int,它會通過在實際的內含價值,當它不能找到一,它會把它作爲默認值。 因此,通過檢查ev是否爲null,您可以判斷隱含在呼叫站點是否可用。

+0

因此它將'Int'測試從編譯時間移動到運行時間?聽起來像是要避免的事情。 – jwvh

+0

@jwvh,而不是測試本身。看,如果沒有提供一個值,那麼「測試」就是隱式搜索。在迪瑪的情況下,「執行」根本沒有測試。 – pedrofurla

+3

@jwvh被授予,它不是非常「主流」,但是它有一些合理的用途......尤其是,如果你使用的約束條件不如'=:='更嚴格。例如:'def foo [T](bar:T)(imp ev:T <: Dima