【问题标题】:Implicit parameter and ClassTag隐式参数和 ClassTag
【发布时间】:2014-05-18 14:22:53
【问题描述】:

有人可以解释一下 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 添加了一个隐含类型信息来克服擦除,但我不明白这与我的排序隐式参数有什么关系,或者为什么编译器突然认为排序没有价值......

【问题讨论】:

    标签: scala scala-2.10


    【解决方案1】:

    这个:

    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)
    }
    

    【讨论】:

    • 很清楚但是有一个小错误。我们应该使用implicitly[ClassTag[T]],因为隐式参数不止一个,我们需要确定我们想要哪个。
    • @cloud 不,参数按顺序区分,第一个参数是ClassTag[T],第二个参数是Ordering[T]。因为可以推断类型参数,所以一个简单的implicitly 就足够了。
    • 该死的我忘了类型推断...谢谢你的解释,你的回答很完美!
    • 关键信息是您必须传递 all 隐式参数或不传递任何参数。在我的问题中,我提到了 “我知道 ClassTag 添加了一个隐含的类型信息来克服擦除......”,但我没有意识到明确定义全部或不明确定义的要求隐式参数。
    猜你喜欢
    • 1970-01-01
    • 2018-05-02
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多