是否有任何理由为什么collection.mutable.Queue和collection.mutable.PriorityQueue不会在
Scala标准库中共享类似QueueLike基本特征的东西?入队&出列方法似乎具有相同的签名.为什么类不能作为队列容器互换,或者我错过了什么?
解决方法
也许这应该是一个答案,而不仅仅是评论……
您使用的是什么版本的Scala?我检查了2.10,2.9,2.8和
2.7 api文档,但没有一个具有QueueLike特征.如果问题是关于可以由不可变和可变实现共享的常见QueueLike特性的概念,则存在一个问题:可变类在其包含的类型参数中都是不变的.不可变集合类在其包含的类型参数中都是协变的.任何涉及所包含类型的值的API成员,无论是作为参数还是返回类型,都不能由不可变和可变实现共享.
第二轮:
package rrs.scribble import scala.collection.mutable.{Queue,PriorityQueue} import scala.math.Ordering trait QueueOps[T] { def dequeue(): T def enqueue(elems: T*): Unit } object UniQueue { sealed trait QSel object PrioQ extends QSel object PlainQ extends QSel def apply[T : Ordering](kind: QSel): QueueOps[T] = kind match { case PrioQ => new PriorityQueue[T]() with QueueOps[T] case PlainQ => new Queue[T]() with QueueOps[T] } } object UQTest { import UniQueue._ def main(args: Array[String]) { val prq1 = UniQueue[Int](PrioQ) val plq1 = UniQueue[Int](PlainQ) prq1.enqueue(1,4,9) plq1.enqueue(9,1) val prq2 = UniQueue[Int](PrioQ) val plq2 = UniQueue[Int](PlainQ) printf("prq1: dequeue=%d; dequeue=%d; dequeue=%d%n",prq1.dequeue,prq1.dequeue) printf("plq1: dequeue=%d; dequeue=%d; dequeue=%d%n",plq1.dequeue,plq1.dequeue) prq2.enqueue(9,1) plq2.enqueue(1,9) printf("prq2: dequeue=%d; dequeue=%d; dequeue=%d%n",prq2.dequeue,prq2.dequeue) printf("plq2: dequeue=%d; dequeue=%d; dequeue=%d%n",plq2.dequeue,plq2.dequeue) } }
在SBT中运行:
> run [info] Running rrs.scribble.UQTest prq1: dequeue=9; dequeue=4; dequeue=1 plq1: dequeue=9; dequeue=4; dequeue=1 prq2: dequeue=9; dequeue=4; dequeue=1 plq2: dequeue=1; dequeue=4; dequeue=9
但是,你会发现,只要写了一些东西,你就可以用UniQueue.apply()返回的值来做两件事,那就是调用enqueue和dequeu.您必须复制您希望能够用于特征QueueOps [T]的所有其他方法签名,如果有任何变体签名,您将无法执行此操作.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。