Scala队列&;优先队列基本特征

Scala队列&;优先队列基本特征,scala,data-structures,Scala,Data Structures,是否有任何原因导致collection.mutable.Queue和collection.mutable.PriorityQueue在Scala标准库中不共享类似QueueLike的基本特征?enqueue和dequeue方法似乎具有相同的签名。为什么类不能作为队列容器互换,或者我遗漏了什么?也许这应该是一个答案,而不仅仅是一个注释 您使用的是什么版本的Scala?我检查了2.10,2.9,2.8和 2.7 API文档,它们都没有类似队列的特性。如果问题是关于不可变和可变实现都可以共享的公共Qu

是否有任何原因导致
collection.mutable.Queue
collection.mutable.PriorityQueue
在Scala标准库中不共享类似
QueueLike
的基本特征?
enqueue
dequeue
方法似乎具有相同的签名。为什么类不能作为队列容器互换,或者我遗漏了什么?

也许这应该是一个答案,而不仅仅是一个注释


您使用的是什么版本的Scala?我检查了2.10,2.9,2.8和 2.7 API文档,它们都没有类似队列的特性。如果问题是关于不可变和可变实现都可以共享的公共
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, 4, 1)
    val prq2 = UniQueue[Int](PrioQ)
    val plq2 = UniQueue[Int](PlainQ)

    printf("prq1: dequeue=%d; dequeue=%d; dequeue=%d%n", prq1.dequeue, prq1.dequeue, prq1.dequeue)
    printf("plq1: dequeue=%d; dequeue=%d; dequeue=%d%n", plq1.dequeue, plq1.dequeue, plq1.dequeue)

    prq2.enqueue(9, 4, 1)
    plq2.enqueue(1, 4, 9)
    printf("prq2: dequeue=%d; dequeue=%d; dequeue=%d%n", prq2.dequeue, prq2.dequeue, prq2.dequeue)
    printf("plq2: dequeue=%d; dequeue=%d; dequeue=%d%n", plq2.dequeue, 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
。您必须复制所有其他希望能够使用的方法签名以
trait QueueOps[T]
,如果存在任何具有变体签名的方法签名,您将无法执行此操作。

您使用的是什么版本的Scala?我检查了2.10、2.9、2.8和2.7API文档,没有一个具有类似队列的特性。如果问题是关于不可变和可变实现都可以共享的公共
QueueLike
特性的概念,那么就有一个问题:可变类在其包含的类型参数中都是不变的。不可变集合类在其包含的类型参数中都是协变的。任何涉及包含类型的值的API元素都不能被不可变和可变实现共享。请看问题-我只谈论可变版本。本质上,我希望有一个factory对象,它根据传递的参数返回
PriorityQueue
或简单的
Queue
。因此,返回类型应该是两者的统一。从我所看到的情况来看,统一导致了类似于
Seq
的东西,这对我来说很奇怪,因为我需要一些基本类型,它们具有
enqueue
dequeue
方法。我希望这是有道理的。