カスタム コンストラクター ロジックを使用して Scala の不変マップを拡張するクラスを作成しています。簡単な例として、 として初期化された整数から文字列へのマップが必要だとします1 -> "one", 2 -> "two"
。REPL では、次のように記述できます。
scala> import collection.immutable.HashMap
import collection.immutable.HashMap
scala> HashMap[Int, String](1->"one", 2->"two")
res0: scala.collection.immutable.HashMap[Int,String] = Map(1 -> one, 2 -> two)
私のプログラムでは、同じコンストラクター呼び出しを使用したいのですが、クラス定義行に入れようとすると、「コンストラクターの引数が多すぎます」というエラーが発生します。
scala> class MyMap extends HashMap[Int, String](1->"1", 2->"2")
<console>:8: error: too many arguments for constructor HashMap: ()scala.collection.immutable.HashMap[Int,String]
class MyMap extends HashMap[Int, String](1->"1", 2->"2")
^
スーパークラス コンストラクターを呼び出す方法がクラス定義にあることを考えるとHashMap
、REPL で a を作成する式は定義でも機能するはずですが、ここで見逃している微妙な点がいくつかあります。
(デフォルトのマップ実装を使用したいので、ここではトレイトの代わりに具象クラスを拡張するのHashMap
が正しいと思います。拡張HashMap
はJavaで行うことですが、具象コレクションを拡張することを100%確信しているわけではありませんクラスは最もスカラエスクな操作方法です。)
不変にしたいのでMyMap
、コンストラクター時に初期値を指定する必要があります。apply
次のように、コンパニオン オブジェクトの関数内で初期化を試みることができます。
class MyMap extends HashMap[Int, String]
object MyMap {
def apply() = new MyMap ++ List(1 -> "one", 2 -> "two")
}
ただしMyMap()
、 の代わりに不変のマップを返しますMyMap
。
初期化する正しい方法は何MyMap
ですか?
具象型を使用した Map の実装に関するこのリンクは関連しています。