在 scala 中,我们可以使用隐式类型类有条件地将方法添加到依赖于该类型参数的参数化类型。例如, Iterator.sum :

def sum[B >: A](implicit num: Numeric[B]): B = foldLeft(num.zero)(num.plus)

必须有一个 Numeric 类型类的实例才能调用此方法:
scala> List(1, 2, 3).sum
res0: Int = 6

scala> List("a", "b").sum
<console>:6: error: could not find implicit value for parameter num: Numeric[java.lang.String]
       List("a", "b").sum
                  ^

到现在为止还挺好。假设我想要一些集合类型 My2Col :
class My2Col[A](a1 : A, a2 : A)

但我想强制要求, 如果 这是用 A : Numeric 然后 a2 > a1 。但是,使用非数字的 A 制作它是完全有效的。
My2Col("a", "b") //OK
My2Col("b", "a") //OK
My2Col(1, 2)     //OK
My2Col(2, 1)     //THROW IllegalArgumentException

有没有人对我如何做到这一点有任何想法?

PS。如果有人对更好的问题标题有任何建议,我会全神贯注

最佳答案

class My2Col[A](a1 : A, a2 : A)(implicit num: Numeric[A] = null){
  for{check <- Option(num); if(check.gteq(a1, a2))}
     throw new IllegalArgumentException
}

关于scala - 添加依赖于类型类的有效性检查(可选的隐式),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4364601/

10-14 16:02
查看更多