3

我必须处理 scala 2.7.5 中的不可变对象,它的成员之一是不可变的 Sortedset。我对加法没有问题,综合起来,它给出:

class MyClass[A](s:SortedSet[A]) {
  ...
  def  + (elem:A):MyClass[A] {
    new MyClass(s + elem)
  }
}

它可以工作,因为 + 运算符在 trait sortedSet 中是重载的,以返回一个 SortedSet。

不幸的是,删除元素失败,因为 - 方法没有重载:

class MyClass[A](s:SortedSet[A]) {
  ...
  def  - (elem:A):MyClass[A] {
    new MyClass(s - elem) // Compiler error: (s - elem) is a Set[A]
  }
}

有谁知道当我抑制一个元素时我如何获得一个排序集: - 我不想使用像 TreeSet 这样更具体的集合。- 我不能使用不太具体的特征作为 Set[A] 而不是我的 SortedSet。

4

3 回答 3

3

如果您可以等到 2.8,看起来这将正常工作。

来自SortedSetLike.scala(不可变特征的超SortedSet特征)

trait SortedSetLike[A, +This <: SortedSet[A] with SortedSetLike[A, This]] extends Sorted[A, This] with SetLike[A, This]

这使得This类型 a SortedSet。然后在SetLike.scala中,-操作员的签名是

def - (elem: A): This

SortedSet所以在 a 上使用时会正确返回a SortedSet

于 2009-08-13T11:46:46.630 回答
1

与人们的想法相反,-不会保证SortedSet结果。小集合通过不同的类进行优化。由于 Set-是抽象的,您不知道它是如何实现的,并且 aSortedSet可以自由地以返回未排序集合的方式实现它。

以下是低效的,但它有效。您可以使用它,使用asInstanceOf,或等待 2.8。:-)

class MyClass[A](s: SortedSet[A]) {
  def -(elem: A)(implicit view: A => Ordered[A]): MyClass[A] = {
    new MyClass(TreeSet(s.toList - elem: _*))
  }
}
于 2009-08-13T17:12:05.963 回答
0

我认为你需要做的就是投射它。“-”返回一个 Set,但它也是一个 SortedSet。它可能不漂亮,但它有效:

class MyClass[A](s:SortedSet[A]) {
    def  +(elem:A): MyClass[A] = {
      new MyClass(s + elem)
    }

    def  -(elem:A): MyClass[A] = {
      new MyClass((s - elem).asInstanceOf[SortedSet[A]])
    }

    override def toString = "sorted set = " + s
  }

  val a = new MyClass(new TreeSet[Int])
  println(a) // prints "sorted set = Set()"
  val b = a + 1
  println(b) // prints "sorted set = Set(1)"
  val c = a - 1
  println(c) // prints "sorted set = Set()"
于 2009-08-13T14:07:25.247 回答