使用隐式类型类参数作为默认参数
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)
}
考虑以下代码。
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)
}