簡體   English   中英

Scala Queue和PriorityQueue基本特征

[英]Scala Queue & PriorityQueue base trait

是否有任何理由為什么collection.mutable.Queuecollection.mutable.PriorityQueue不會在Scala標准庫中共享類似QueueLike基本特征的東西? enqueuedequeue方法似乎具有相同的簽名。 為什么類不能作為隊列容器互換,或者我錯過了什么?

也許這應該是一個答案,而不僅僅是評論......

您使用的是什么版本的Scala? 我檢查了QueueLike和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, 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()返回的值來做兩件事,那就是調用enqueuedequeu 您必須復制您希望能夠用於trait QueueOps[T]所有其他方法簽名,如果有任何變體簽名,您將無法執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM