4

我试图用新的关键字创建一个队列。我为可变队列和不可变队列做了这件事。

但是当我尝试使用不可变队列时,它给出了错误:

<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()

谁能告诉我,为什么会这样???

4

4 回答 4

4

快速浏览一下源代码,我敢肯定,不可变版本本质上是通过几个Lists 实现的,这些 s 根据需要在读取写入之间提供良好的性能(队列/出队)。

这与其他集合完全不同,因为它需要两个提到List的 s 作为class构造函数的参数。
另一方面,伴随对象通过接受可变数量的Queue内容初始值来提供与其他集合一致的公共工厂方法。

缺少的是该类的公共构造函数,它将apply通过获取初始值并使用它们来构建“入队/出队”来模仿伴随对象的调用Lists

也许它被认为不是必需的,或者它是一个疏忽,或者有一个我无法弄清楚的更深层次的问题。

于 2013-02-05T10:00:04.210 回答
3

编译器已经告诉你为什么它不起作用,因为构造函数是protected. 您必须使用apply同伴的方法来创建immutable.Queue

val queue = immutable.Queue(1,2,3)
于 2013-02-05T09:32:40.160 回答
1

我将这个问题解释为“为什么构造函数受到保护”。我们只能猜测,但我倾向于认为这是一个简单的疏忽。就风格而言,通常最好使用伴随对象来实例化集合,但考虑到您也可以直接实例化其他具体集合,这应该与Queue. 换句话说,我绝对认为Queue应该有这个没有参数的构造函数来创建一个空队列,如果只是为了保持一致性:

class Queue[+A] extends ... {
  ...
  def this() { this( Nil, Nil ) }
  ...
}

虽然这是非常主观的。

于 2013-02-05T10:00:34.143 回答
0

我猜是因为鼓励使用它empty来创建 void 不可变集合,因为它避免了开销(如果你多次这样做)并最大限度地利用了不变性。只是不需要每次都创建新实例,因为“世界上只有一个空队列”。对于可变集合,显然这是行不通的。

于 2013-02-05T14:57:25.927 回答