【问题标题】:What does "T =:= Int = null" mean in Scala?Scala 中的“T =:= Int = null”是什么意思?
【发布时间】:2017-10-08 09:37:17
【问题描述】:

如下代码所示。

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

【问题讨论】:

    标签: scala


    【解决方案1】:

    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](bar: T)(implicit ev: T <:< AnyRef = null) 可让您判断 T 是否为值类型,因为您可能希望以不同的方式对待它。不是类型检查转移到运行时,更像是一些额外的编译时信息被带到运行时。
    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 2016-03-09
    • 1970-01-01
    • 2023-03-27
    • 2021-11-16
    • 2013-05-28
    • 1970-01-01
    • 2014-01-16
    相关资源
    最近更新 更多