Scala 为什么;错误:…发散隐式扩展…“;当我使用SortedSet时?

Scala 为什么;错误:…发散隐式扩展…“;当我使用SortedSet时?,scala,Scala,我正在为不耐烦的人学习Scala,并且正在努力为第10章第2个练习的解决方案编写测试:通过将Scala.math.Ordered[Point]混合到java.awt.Point中来定义一个类OrderedPoint。 使用字典顺序,即(x,y)

我正在为不耐烦的人学习Scala,并且正在努力为第10章第2个练习的解决方案编写测试:通过将Scala.math.Ordered[Point]混合到java.awt.Point中来定义一个类OrderedPoint。 使用字典顺序,即(x,y)<(x',y'),如果x 我的班级按照书的要求做了,但我似乎无法让它与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)
    }
  }
}
规范定义足够简单,但一旦我将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)
  }
}
包stfi.ch10
导入org.scalatest.FlatSpec
导入sfti.ch10.OrderedPoint
类Ex02_OrderedPointSpec扩展了FlatSpec{
“OrderedPoint”必须在中“使java.awt.Points具有可比性”{
val p_0_1=新订购点(0,1)
val p_1_0=新订购点(1,0)
val p_1_1=新订购点(1,1)
val p_0_0=新订购点(0,0)
断言(p_0_0.比较(p_0_0)=0)
断言(p_0_0.比较(p_0_1)<0)
断言(p_1_1.比较(p_1_0)>0)
//这将提示编译器
val sortedSet=scala.collection.sortedSet(p_1_1,p_0,p_1_0,p_0_1)
}
}
错误:(19,53)sfti.ch10.OrderedPoint类型的发散隐式扩展=>可比[sfti.ch10.OrderedPoint]
从对象Predef中的方法$confirms开始
val s=scala.collection.SortedSet[OrderedPoint](p_1_1,p_0,p_1_0,p_0_1)

为什么SortedSet不尊重我的订单比较

我已经看过了,好像他们在说方言。我必须对OrderedPoint或SortedSet调用做什么才能使SortedSet使用OrderedPoint的compare方法?

将其更改为

with scala.math.Ordered[OrderedPoint]

Ordered
是不变的,因此类型参数需要精确匹配。

这就行了。但奇怪的是,这似乎是多余的<代码>类OrderedPoint(x:Int,y:Int)使用scala.math.Ordered[OrderedPoint]扩展了java.awt.Point(x,y)。就像我结结巴巴地告诉Order我正在使用的是什么,但我在类定义中,编译器应该已经知道了!看来我有办法了解Scala的类型系统。