Scala Context Bounds语法错误

时间:2014-10-04 00:27:14

标签: scala

我试图看看我是否理解Scala中的Context Bounds,所以我写了一个小例子来看看隐式变量是如何传递的。我的代码如下。

  class Data(_x : Int) {
    var x = _x
  }

  class DataOrdering extends Ordering[Data] {
    def compare(d1 : Data, d2 : Data) : Int = d1.x - d2.x
  }

  def globalCompare[Data : Ordering](d1 : Data, d2 : Data) {
    println("Global compare: " + implicitly[Ordering[Data]].compare(d1, d2))
  }

  def caller()(implicit d : Ordering[Data]) {
    println("Caller")
    globalCompare(new Data(5), new Data(100))
  }

  // Error method here
  def caller2[Data : Ordering]() {
    println("Caller2")
    globalCompare(new Data(50), new Data(100))
  }

  def main() {
    implicit val dataOrdering : DataOrdering = new DataOrdering
    caller
    caller2
  }

  main

调用globalCompare时调用caller()方法的工作正常,但caller2()给出了编译错误

  error: class type required but Data found
  globalCompare(new Data(50), new Data(100))
                    ^

  error: class type required but Data found
  globalCompare(new Data(50), new Data(100))
                                  ^

我希望caller()和caller2()是等价的,但我似乎错过了一些东西。有人可以向我解释我做错了吗?

1 个答案:

答案 0 :(得分:1)

在caller2中,Data是一个类型参数,而不是类名。

这可能在某个地方被骗了。

here一样,@ TravisBrown在annoying中将其称为extreme

当你隐藏一个具体的类型名称时,我不知道是否更烦人。我想知道Xlint是否会警告你这件事。有人的作品应该是。