加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala Queue和PriorityQueue基本特征

发布时间:2020-12-16 19:24:59 所属栏目:安全 来源:网络整理
导读:是否有任何理由为什么collection.mutable.Queue和collection.mutable.PriorityQueue不会在 Scala标准库中共享类似QueueLike基本特征的东西?入队出列方法似乎具有相同的签名.为什么类不能作为队列容器互换,或者我错过了什么? 解决方法 也许这应该是一个答案
是否有任何理由为什么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]的所有其他方法签名,如果有任何变体签名,您将无法执行此操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读