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

ソースコードをざっと見てみると、不変バージョンは基本的に、読み取り書き込み(キュー/デキュー)Listの間で優れたパフォーマンスを提供するために必要に応じてピボットするいくつかの によって実装されていることがわかります。

これは、コンストラクターListへのパラメーターとして言及された両方の s を必要とするという点で、他のコレクションとはまったく異なります。 一方、コンパニオン オブジェクトは、コンテンツの可変数の初期値を受け入れることにより、他のコレクションと一貫性のあるパブリック ファクトリ メソッドを提供します。class
Queue

apply欠けているのは、初期値を取得し、それらを使用して "enque/dequeue" を構築することにより、コンパニオン オブジェクトの呼び出しを模倣するクラスのパブリック コンストラクターです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オーバーヘッドを回避し(これを複数回行う場合)、不変性を最も活用するため、無効な不変コレクションを作成するために使用することが推奨されているためだと思います。「空のキューは世界に 1 つしかない」ため、毎回新しいインスタンスを作成する必要はありません。可変コレクションの場合、これが機能しないことは明らかです。

于 2013-02-05T14:57:25.927 に答える