3

scala ジェネリックとデフォルトのパラメーター値についていくつか質問があります。

次のクラス定義があるとします (ここで、Stack[E] は特性です)。

class ImmutableStack[E](capacity: Int = 10, elems: Array[E] = new Array[E](capacity))(implicit ev: ClassTag[E]) extends Stack[E]

そのコードをコンパイルしようとすると、次の 2 つのエラーが発生します。

scala: cannot find class tag for element type E
class ImmutableStack[E <: Any](capacity: Int = 10, elems: Array[E] = new Array[E](capacity))(implicit ev: ClassTag[E]) extends SedgewickStack[E] {
                                                                 ^

と:

scala: not found: value capacity
class ImmutableStack[E <: Any](capacity: Int = 10, elems: Array[E] = new Array[E](capacity))(implicit ev: ClassTag[E]) extends SedgewickStack[E] {
                                                                                  ^

誰かが私に説明できますか:

  1. コンストラクター定義の他のパラメーターで容量パラメーターを使用できないのはなぜですか?
  2. evデフォルトのパラメータ値でClassTag を使用できないのはなぜnew Array[E](capacity)ですか?

elem パラメータのデフォルト値を削除すると、すべて正常に動作します。

ご回答ありがとうございます。

4

1 に答える 1

1

コンストラクターとメソッドのデフォルト値には、同じものではなく、以前の引数リストの値のみを使用できます。

class ImmutableStack[E <: Any](capacity: Int = 10)(elems: Array[E] = new Array[E](capacity))(implicit ev: ClassTag[E])

暗黙のクラスタグを使用できないことを回避するために、私が提供できる最善の方法は

class ImmutableStack[E <: Any : ClassTag](capacity: Int = 10)(elems: Array[E] = null) {
  val realElems = if (elems != null) elems else new Array[E](capacity)
}
于 2013-09-17T08:17:09.790 に答える