我尝试使用新的Keyword创建一个Queue ..我为可变和不可变的Queue做了它。
但是当我尝试使用不可变队列时,它会出错:
<console>:8: error: constructor Queue in class Queue cannot be accessed in object $iw
Access to protected constructor Queue not permitted because
enclosing class object $iw in object $iw is not a subclass of
class Queue in package immutable where target is defined
val a=new Queue[Int]()
^
scala> import scala.collection.immutable.Queue
import scala.collection.immutable.Queue
scala> val a=new Queue[Int]()
<console>:8: error: constructor Queue in class Queue cannot be accessed in object $iw
Access to protected constructor Queue not permitted because
enclosing class object $iw in object $iw is not a subclass of
class Queue in package immutable where target is defined
val a=new Queue[Int]()
但是当我尝试使用可变队列,不可变堆栈,可变堆栈的代码时......它运行良好
scala> import scala.collection.mutable.Queue
import scala.collection.mutable.Queue
scala> val a=new Queue[Int]()
a: scala.collection.mutable.Queue[Int] = Queue()
scala> import scala.collection.immutable.Stack
import scala.collection.immutable.Stack
scala> val a=new Stack[Int]()
a: scala.collection.immutable.Stack[Int] = Stack()
scala> import scala.collection.mutable.Stack
import scala.collection.mutable.Stack
scala> val a=new Stack[Int]()
a: scala.collection.mutable.Stack[Int] = Stack()
谁能告诉我,为什么会这样呢?
答案 0 :(得分:4)
通过快速查看sourcecode,我冒昧地说,不可变版本基本上是通过几个List
来实现的,这些List
根据需要转动,以便在读取之间提供良好的性能和写(queue / dequeue)。
这与其他集合非常不同,因为它需要提到class
作为Queue
构造函数的参数。
另一方面,通过接受apply
内容的可变数量的初始值,伴随对象提供与其他集合一致的公共工厂方法。
缺少的是该类的公共构造函数,它将模仿伴随对象Lists
调用,获取初始值,并使用它们构建“enque / dequeue”{{1}}
也许这不是必要的,或者是一种疏忽,或者是一个我无法弄清楚的更深层次的问题。
答案 1 :(得分:3)
编译器已经告诉你它为什么不起作用,因为结构符是protected
。您必须使用随播广告的apply
方法创建immutable.Queue
:
val queue = immutable.Queue(1,2,3)
答案 2 :(得分:1)
我将这个问题解释为“为什么构造函数受到保护”。
我们只能猜测,但我倾向于认为这是一个简单的疏忽。
作为一种风格问题,通常最好使用伴随对象来实例化集合,但考虑到您也可以直接实例化其他具体集合,这应该与Queue
一致。换句话说,我绝对认为Queue
应该有这个没有arg构造器来创建一个空队列,只是为了保持一致性:
class Queue[+A] extends ... {
...
def this() { this( Nil, Nil ) }
...
}
虽然这是非常主观的。
答案 3 :(得分:0)
我猜这是因为鼓励使用empty
来创建void immutable集合,因为它避免了开销(如果你多次这样做)并且最大程度地利用不变性。不需要每次都创建新实例,因为“世界上只有一个空队列”。对于可变集合,很明显这不起作用。