Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala &引用;新";关键字不';不能使用不可变队列_Scala_Stack_Queue - Fatal编程技术网

Scala &引用;新";关键字不';不能使用不可变队列

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

我试图用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 $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 ) }
  ...
}