Scala &引用;新";关键字不';不能使用不可变队列
我试图用new关键字创建一个队列。我对可变队列和不可变队列都这样做了 但当我尝试使用不可变队列时,它给出了错误:Scala &引用;新";关键字不';不能使用不可变队列,scala,stack,queue,Scala,Stack,Queue,我试图用new关键字创建一个队列。我对可变队列和不可变队列都这样做了 但当我尝试使用不可变队列时,它给出了错误: <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 $i
<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]()
有谁能告诉我,为什么会这样吗?编译器已经告诉您为什么它不工作了,因为构造函数受
保护。您必须使用companion的apply
方法来创建一个不可变的队列
:
val queue = immutable.Queue(1,2,3)
通过快速查看,我敢说,不可变版本基本上是通过两个List
s实现的,它们根据需要进行旋转,以在读写(队列/出列)之间提供良好的性能
这与其他集合非常不同,因为它需要同时提到列表
s作为类
构造函数的参数。
另一方面,伴随对象通过为队列
内容接受数量可变的初始值,提供了与其他集合一致的公共工厂方法
缺少的是类的公共构造函数,它将通过获取初始值来模拟伴随对象apply
调用,并使用它们来构建“enque/dequeue”列表
也许这并不重要,或者这是一个疏忽,或者有一个更深层次的问题我无法理解。我将把这个问题解释为“为什么构造函数受到保护”。
我们只能猜测,但我倾向于认为这是一个简单的疏忽。
就风格而言,通常最好使用伴生对象来实例化集合,但考虑到您也可以直接实例化其他具体集合,这应该与Queue
结合使用。换句话说,我绝对认为Queue
应该有这个no-arg构造函数来创建一个空队列,如果只是为了一致性:
class Queue[+A] extends ... {
...
def this() { this( Nil, Nil ) }
...
}
但这是非常主观的。我想这是因为鼓励使用empty
创建无效的不可变集合,因为它避免了开销(如果您多次这样做)并最大限度地利用了不可变性。只是不需要每次都创建新实例,因为“世界上只有一个空队列”。对于可变集合,这显然不起作用。Queue和大多数其他集合构造函数都隐藏在标准库中。相反,您应该使用工厂方法,如Queue[Int]()
或Queue.empty[Int]
而不使用新关键字。这是设计选择。但我想知道原因,为什么只有不可变队列,可变队列,这是好的。但我想知道原因,为什么只有不可变队列,可变队列,这是好的…是的。我想这才是真正的问题我想你只能从scala的人那里得到一个明确的答案,所以我建议你在他们的邮件列表上提问。
class Queue[+A] extends ... {
...
def this() { this( Nil, Nil ) }
...
}