使用隐式类型类参数作为默认参数

Use implicit typeclass parameter for default argument

考虑以下代码。

def create[A: Ordering]: Unit = ()

case class Test[A: Ordering](x: Unit = create[A])

编译器抱怨,因为在第二行,他找不到调用create所需的隐式参数:

ScalaFiddle.scala:5: error: No implicit Ordering defined for A. case class Test[A: Ordering](x: Unit = create[A])

为什么会这样,因为应该有一个 Ordering[A] 徘徊? 我该如何解决这个问题?

这是由于编译器会尝试翻译:

case class Test[A: Ordering](x: Unit = create[A])

至:

case class Test[A](x: Unit = create[A])(implicit ordering: Ordering[A])

如您所见,编译器找不到 default create[A]implicit Ordering 参数,下面是一个简单的例子来证明这一点:

scala> def foo[A: Ordering](): Unit = ()
foo: [A]()(implicit evidence: Ordering[A])Unit

scala> def bar[A: Ordering](x: Unit = foo[A]): Unit = ()
<console>:12: error: No implicit Ordering defined for A.
       def bar[A: Ordering](x: Unit = foo[A]): Unit = ()

scala> def bar[A: Ordering](x: Unit = foo[Double]): Unit = ()
bar: [A](x: Unit)(implicit evidence: Ordering[A])Unit

对于解决方案,也许你可以使用 class 绑定 Ordering,也许像:

class Foo[A](implicit ordering: Ordering[A]) {
  def create: Unit = ()
  case class Test(x: Unit = create)
}