【问题标题】:Why "Error:...diverging implicit expansion..." when I use SortedSet?为什么在我使用 SortedSet 时出现“错误:...发散隐式扩展...”?
【发布时间】:2018-10-09 21:54:37
【问题描述】:

我正在为不耐烦的人使用 Scala,并且正在努力为第 10 章第二个练习的解决方案编写测试:通过将 scala.math.Ordered[Point] 混合到 java.awt.Point 中来定义一个 OrderedPoint 类。 使用字典顺序,即 (x, 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 方法?

【问题讨论】:

    标签: scala


    【解决方案1】:

    改成

    with scala.math.Ordered[OrderedPoint]
    

    Ordered 是不变的,所以类型参数需要完全匹配。

    【讨论】:

    • 那行得通。不过,这似乎有点多余。 class OrderedPoint(x: Int, y: Int) extends java.awt.Point(x, y) with scala.math.Ordered[OrderedPoint]。就像我结结巴巴地告诉 Ordered 我正在使用什么,但我在类定义中,编译器应该已经知道了!看来我有办法理解 Scala 的类型系统了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2012-03-18
    • 1970-01-01
    • 2017-12-30
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多