编写检查scala中数字是否为0的泛型方法的最佳方法

编写检查scala中数字是否为0的泛型方法的最佳方法,scala,Scala,我知道这对于一个简单的案例检查来说是非常微不足道的,但是似乎应该可以编写一个方法来执行以下操作,即泛化到所有数值类型: def checkNonZero(t: Long, field: String): List[String] = { if (t == 0) println("was zero") else println("wasn't zero") } 执行此操作的最佳方法是什么?这可以通过使用编号类型来完成 def checkNonZero(n: Number) = n

我知道这对于一个简单的案例检查来说是非常微不足道的,但是似乎应该可以编写一个方法来执行以下操作,即泛化到所有数值类型:

  def checkNonZero(t: Long, field: String): List[String] = {
    if (t == 0) println("was zero") else println("wasn't zero")
  }

执行此操作的最佳方法是什么?

这可以通过使用
编号
类型来完成

def checkNonZero(n: Number) = n != 0
或者,您可以使用
Numeric
typeclass

def checkNonZero[T : Numeric](n: T) = { 
  val num = implicitly[Numeric[T]]
  !num.equiv(n, num.zero)
}
编辑
实际上,你可以这样写:

def checkNonZero[T : Numeric](n: T) = n != 0

当然,除非您定义新的
数值的自定义实例。

Jasper-M的第二个解决方案的替代方法如下:

def isNotZero[A](n: A)(implicit num: Numeric[A]) = !num.equiv(n, num.zero)
这将隐式地保存行
val num=Numeric[A]
,同时如果需要,仍然允许您使用
num

尽管此方法实际上需要2个参数,但由于第二个参数是隐式的,因此可以像使用任何其他非通用单参数方法一样使用它:

isNotZero(3) // true
isNotZero(0.1) // true
isNotZero(0) // false
isNotZero(0.0) // false