隐式参数和ClassTag

时间:2014-05-18 03:05:12

标签: scala scala-2.10

有人能解释一下Scala编译器试图通过下面的错误消息告诉我什么吗?

object Some {
  def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T = data
}
object Other {
  def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T =
    Some(data)(ordering.reverse)
}

编译说:

not enough arguments for method apply: (implicit evidence$2: scala.reflect.ClassTag[T], implicit ordering: Ordering[T])T in object Some. Unspecified value parameter ordering.

当我将ClassTag添加到对象Some中的方法时,出现错误,以便在那里使用某些内部数组。最初,代码是(并且编译没有错误):

object Some {
  def apply[T](data: T)(implicit ordering: Ordering[T]): T = data
}
object Other {
  def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T =
    Some(data)(ordering.reverse)
}

我知道ClassTag添加了隐式的类型信息以克服擦除,但我不明白这与我的排序隐式参数有什么关系,或者为什么编译器突然认为排序没有价值。

1 个答案:

答案 0 :(得分:8)

此:

def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T = data

是这个的语法糖:

def apply[T](data: T)(implicit evidence: ClassTag[T], ordering: Ordering[T]): T = data

当您明确指定隐式参数时,必须同时提供它们。您可以使用implicitly继承隐式ClassTag

object Other { 
  def apply[T: ClassTag](data: T)(implicit ordering: Ordering[T]): T =
    Some(data)(implicitly, ordering.reverse)
}