我有两个SortedMaps,我想形成联盟.这是我想要使用的代码:
import scala.collection._ object ViewBoundExample { class X def combine[Y](a: SortedMap[X,Y],b: SortedMap[X,Y]): SortedMap[X,Y] = { a ++ b } implicit def orderedX(x: X): Ordered[X] = new Ordered[X] { def compare(that: X) = 0 } }
这里的想法是’隐式’语句意味着Xs可以转换为Ordered [X],然后将SortedMaps组合成另一个SortedMap,而不仅仅是一个map.
当我编译时,我得到了
sieversii:scala-2.8.0.Beta1-RC4 scott$bin/scalac -versionScala compiler version 2.8.0.Beta1-RC4 -- copyright 2002-2010,LAMP/EPFL sieversii:scala-2.8.0.Beta1-RC4 scott$bin/scalac ViewBoundExample.scala ViewBoundExample.scala:8: error: type arguments [ViewBoundExample.X] do not conform to method ordered's type parameter bounds [A <: scala.math.Ordered[A]] a ++ b ^ one error found
如果该类型参数绑定是[A<%scala.math.Ordered [A]]而不是[A<:scala.math.Ordered [A]],那么我的问题似乎就会消失.不幸的是,我甚至无法找出“命令”生活的方法!任何人都可以帮我追踪它吗? 如果做不到这一点,我打算如何制作两个SortedMaps的联合?如果我删除了返回类型的组合(或将其更改为Map)一切正常 – 但是我不能依赖返回的排序!
解决方法
scala> import scala.collection.sortedMap import scala.collection.sortedMap scala> val a = SortedMap(1->2,3->4) a: scala.collection.sortedMap[Int,Int] = Map(1 -> 2,3 -> 4) scala> val b = SortedMap(2->3,4->5) b: scala.collection.sortedMap[Int,Int] = Map(2 -> 3,4 -> 5) scala> a ++ b res0: scala.collection.Map[Int,2 -> 3,3 -> 4,4 -> 5) scala> b ++ a res1: scala.collection.Map[Int,4 -> 5)
返回结果的类型是Map [Int,Int],因为这将是MapLike对象返回方法的唯一类型.似乎保留了SortedMap的sorted属性,我想这是因为使用抽象方法来进行连接,并且这些抽象方法被定义为保持map的顺序.
为了拥有两个有序映射的联合,我建议你使用scala.collection.immutable.sortedMap.
scala> import scala.collection.immutable.sortedMap import scala.collection.immutable.sortedMap scala> val a = SortedMap(1->2,3->4) a: scala.collection.immutable.sortedMap[Int,4->5) b: scala.collection.immutable.sortedMap[Int,4 -> 5) scala> a ++ b res2: scala.collection.immutable.sortedMap[Int,4 -> 5) scala> b ++ a res3: scala.collection.immutable.sortedMap[Int,4 -> 5)
SortedMap特征的这种实现声明了一个返回SortedMap的方法.
现在,您对类型边界的问题有几个答案:
> Ordered [T]是一个特征,如果在一个类中混合,它指定可以使用< ;,>,=,> =,< =来比较该类.你只需要定义抽象方法compare(that:T),它为此返回-1<那,1为此>那个和0对于这个==那个.然后基于比较结果在特征中实现所有其他方法.
> T<%U表示Scala中的视图绑定.这意味着类型T要么是U的子类型,要么可以通过范围中的隐式转换隐式转换为U.如果您将<%但不与<:放在一起,因为X不是Ordered [X]的子类型,但是可以使用OrderedX隐式转换隐式转换为Ordered [X].
编辑:关于你的评论.如果您正在使用scala.collection.immutable.sortedMap,那么您仍然在编程接口而不是实现,因为不可变的SortedMap被定义为特征.您可以将其视为scala.collection.sortedMap的一个更专业的特性,它提供了额外的操作(比如返回SortedMap)和不可变的属性.这符合Scala哲学 – 更喜欢不变性 – 因此我没有看到使用不可变SortedMap的任何问题.在这种情况下,您可以保证结果肯定会被排序,并且由于集合是不可变的,因此无法更改.
虽然,我仍然觉得奇怪的是scala.collection.sortedMap没有提供一个返回SortedMap的方法作为结果.我所做的所有有限测试似乎都表明,两个scala.collection.sortedMaps的串联结果确实产生了一个保存已排序属性的映射.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。