Scala 什么是;T=:=Int=null";在斯卡拉是什么意思?

Scala 什么是;T=:=Int=null";在斯卡拉是什么意思?,scala,Scala,如下代码所示 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的正确用法。null只是给ev分配一个默认值,就像你给任何其他

如下代码所示

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
的正确用法。

null
只是给
ev
分配一个默认值,就像你给任何其他参数一样。 这是一种聪明的方法,可以确定类型是否实际上是
Int

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

 isInt[Int] // true
 isInt[String] // false
诀窍在于,当编译器看到
Int
时,它将传入实际的隐式值,当它找不到隐式值时,它只将其保留为默认值。
因此,通过检查
ev
是否为
null
,您可以判断隐式是否在调用站点可用。

因此它将
Int
测试从编译时移动到运行时?听起来像是要避免的事情。@jwvh,不是测试本身。请参阅,“测试”是在未提供值的情况下搜索隐式表达式。在Dima的例子中,是“执行”一点也不测试。@jwvh承认,它不是很“主流”,但它有一些合法的用途。。。特别是,如果使用比
=:=
更严格的约束。例如:
def foo[T](条:T)(隐式ev:T