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

时间:2017-05-16 10:14:27

标签: scala typeclass implicit

请考虑以下代码。

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

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

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

  

ScalaFiddle.scala:5:错误:没有为A. case定义隐式排序   class Test [A:Ordering](x:Unit = create [A])

为什么会发生这种情况,因为应该有一个Ordering[A]? 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

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

为:

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

如您所见,编译器无法找到默认 implicit Ordering的{​​{1}}参数,下面是一个证明这一点的简单示例:

create[A]

对于解决方案,也许你可以使用scala> def foo[A: Ordering](): Unit = () foo: [A]()(implicit evidence$1: 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$1: Ordering[A])Unit 绑定class,也许就像:

Ordering