gpt4 book ai didi

scala - 为什么我使用 SortedSet 时出现 "Error:...diverging implicit expansion..."?

转载 作者:行者123 更新时间:2023-12-01 08:28:56 25 4
gpt4 key购买 nike

我正在努力学习 Scala for the Impatient 并努力为第 10 章第二个练习的解决方案编写测试:通过将 scala.math.Ordered[Point] 混合到 java.awt.Point 中定义一个类 OrderedPoint。使用词典顺序,即 (x, y) < (x', y') 如果 x < x' 或 x = x' 且 y < y'。

我的类(class)按照书上的要求进行,但我似乎无法让它与 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)
}
}

错误:(19, 53) 类型 sfti.ch10.OrderedPoint 的发散隐式扩展 => Comparable[sfti.ch10.OrderedPoint]
从对象 Predef 中的方法 $conforms 开始
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 的比较方法?

最佳答案

改成

with scala.math.Ordered[OrderedPoint]

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

关于scala - 为什么我使用 SortedSet 时出现 "Error:...diverging implicit expansion..."?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50089739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com