是否有任何理由爲什麼collection.mutable.Queue
和collection.mutable.PriorityQueue
在Scala標準庫中不共享類似QueueLike
基礎特徵?方法似乎具有相同的簽名。爲什麼這些類不能作爲隊列容器互換,還是我錯過了一些東西?斯卡拉隊列和PriorityQueue基礎特徵
4
A
回答
1
也許這真不愧是一個答案,而不僅僅是一個評論...
什麼版本的斯卡拉您使用的是?我檢查了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, 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]
,如果有任何變體簽名,你將無法做到這一點。
+0
請看這個問題 - 我只談論可變版本。基本上,我想有一個工廠對象,它返回一個'PriorityQueue'或一個簡單的'隊列'基於一些傳遞的參數。所以返回類型應該是兩者的統一。從我看到的統一導致像'Seq'這樣的事情,這對我來說很奇怪,因爲我需要一些具有'enqueue'和'dequeue'方法的基類型。我希望這是有道理的。 –
相關問題
- 1. 斯卡拉密封特徵的迭代?
- 2. Mockito的斯卡拉測試特徵
- 3. 斯卡拉期貨基礎知識
- 4. 斯卡拉PriorityQueue衝突解決?
- 5. 我該如何在斯卡拉的基礎特徵中建立一個類型化(特定)工廠?
- 6. 斯卡拉類與發佈服務器和用戶特徵
- 7. 斯卡拉功能,需要擴展類和特徵的類型
- 8. 斯卡拉自我類型特徵和調用方法的超
- 9. 斯卡拉特徵和類在同一個文件
- 10. 正確使用斯卡拉特徵和類型
- 11. 地圖和斯普利特基於在星火斯卡拉
- 12. 斯卡拉 - 特徵成員初始化:使用特徵修改類成員
- 13. 斯卡拉播放2 Guice的依賴注入特徵
- 14. 斯卡拉:將一個密封特徵實例到HList
- 15. 斯卡拉集合內存足跡特徵
- 16. 具有數組/矢量性能特徵的斯卡拉流
- 17. 斯卡拉postfixOps特徵不是對象塊內作業
- 18. 斯卡拉:如何使用多類型參數特徵
- 19. 基準時間和斯卡拉健身
- 20. 模式對基礎類進行匹配,並在斯卡拉
- 21. 過濾基礎上的可選屬性在斯卡拉
- 22. 斯卡拉系列
- 23. 斯卡拉特點:VAL/DEF和要求
- 24. 斯卡拉特質中的Setter和Getters?
- 25. 斯卡拉特質語法
- 26. PySpark和斯卡拉
- 27. &&和||在斯卡拉
- 28. 使用Implicit排序問題使用PriorityQueue(斯卡拉)
- 29. 斯卡拉和'不同類型的特徵實例映射:java.util.Map [K,V]'
- 30. 斯卡拉類型不匹配的基礎類型和類與方法
您使用的是什麼版本的Scala?我檢查了2.10,2.9,2.8和2.7 API文檔,沒有一個具有QueueLike特性。如果問題是關於可以由不可變和可變實現共享的常見QueueLike特性的_concept_,那麼存在一個問題:可變類在其包含的類型參數中都是不變的。不可變集合類在它們包含的類型參數中都是協變的。涉及包含類型值的任何API元素都不能由不可變和可變實現共享。 –