当我使用SortedSet时,为什么“错误:......分歧隐式扩展......”

时间:2018-04-29 18:07:29

标签: scala

我正在通过Scala为Impatient工作,我正努力为我的第10章练习的解决方案编写测试:通过将scala.math.Ordered [Point]混合到java.awt.Point中来定义类OrderedPoint。 使用词典排序,即(x,y)&lt; (x',y')如果x&lt; x'或x = x'且y < Y”。

我的班级完成了本书所要求的内容,但我似乎无法使用SortedSet。

类定义就像......

package sfti.ch10

import java.awt.Point

class OrderedPoint(x: Int, y: Int) extends java.awt.Point(x, y) with scala.math.Ordered[Point] {
  override def compare(that: Point): Int = {
    if (getX == that.getX) {
      getY.compare(that.getY)
    } else {
      getX.compare(that.getX)
    }
  }
}

Spec定义很简单,但是一旦我将SortedSet放在那里就无法编译。

package stfi.ch10

import org.scalatest.FlatSpec
import sfti.ch10.OrderedPoint

class Ex02_OrderedPointSpec extends FlatSpec {
  "An OrderedPoint" must "make java.awt.Points comparable" in {
    val p_0_1 = new OrderedPoint(0, 1)
    val p_1_0 = new OrderedPoint(1, 0)
    val p_1_1 = new OrderedPoint(1, 1)
    val p_0_0 = new OrderedPoint(0, 0)

    assert(p_0_0.compare(p_0_0) == 0)
    assert(p_0_0.compare(p_0_1) < 0)
    assert(p_1_1.compare(p_1_0) > 0)

    // this tips over the compiler
    val sortedSet = scala.collection.SortedSet(p_1_1, p_0_0, p_1_0, p_0_1)
  }
}

Error:(19, 53) diverging implicit expansion for type sfti.ch10.OrderedPoint => Comparable[sfti.ch10.OrderedPoint] starting with method $conforms in object Predef val s = scala.collection.SortedSet[OrderedPoint](p_1_1, p_0_0, p_1_0, p_0_1)

为什么SortedSet不会尊重我的Ordered比较?

我已经看过What is a diverging implicit expansion error?,就像说方言一样。我需要对OrderedPoint或SortedSet调用做什么才能让SortedSet使用OrderedPoint的compare方法?

1 个答案:

答案 0 :(得分:2)

将其更改为

with scala.math.Ordered[OrderedPoint]

Ordered是不变的,因此type参数需要完全匹配。