我要处理scala 2.7.5中的不可变对象,其中一个成员是immutable 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。
答案 0 :(得分: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
输入SortedSet
。然后在SetLike.scala中,-
运算符的签名是
def - (elem: A): This
因此,在SortedSet
上使用时,会正确返回SortedSet
。
答案 1 :(得分:1)
与人们的想法相反,-
不能保证SortedSet
结果。小套装通过不同的类别进行优化。由于Set的-
是抽象的,因此您不知道如何实现它,并且SortedSet
可以以返回未排序集的方式自由实现它。
以下效率低下,但有效。您可以使用它,与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: _*))
}
}
答案 2 :(得分: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()"