beginner's guideの「8 Genericity」より。Scalaでも型パラメータを使うことができます。
- 「class <クラス名>[<型パラメータ>] ...」といった感じで、「[]」を使って指定します。(Javaと違って「<,>」ではないです。)
- 使い方はJavaと同じ感じです。(beginner's guideの「8 Genericity」を読む限りは。)
サンプル。
// 型パラメータを受け取るクラス class Holder[a](value:a) { private var v: a = value // getter def get:a = { v } // setter def set(value:a):unit = { v = value } } // クラスを使うサンプル object Sample { def main(args: Array[String]) { // クラスのインスタンスを生成。 // 型パラメータで「int」を指定 var h = new Holder[int]( 1 ) println( h.get ) h.set(100) println( h.get ) // 型パラメータを「String」にした場合 var h2 = new Holder[String]( "foo" ) println( h2.get ) h2.set("var") println( h2.get ) } }
実行結果です。
1 100 foo var
次のようにするとコンパイル時にエラーになります。
// クラスを使うサンプル object ErrorSample { def main(args: Array[String]) { // ↓これはエラー var h3 = new Holder[String]( "foo" ) h3.set(100) var h4 = new Holder[int]( 1 ) h4.set("foo") // こういうのもエラーになる h3 = h4 } }
コンパイル結果です。
$ scalac GenericsErrorSample.scala
GenericsErrorSample.scala:19: error: type mismatch;
found : Int(100)
required: String
h3.set(100)
^
GenericsErrorSample.scala:21: error: type mismatch;
found : java.lang.String("foo")
required: int
h4.set("foo")
^
GenericsErrorSample.scala:24: error: type mismatch;
found : Holder[int]
required: Holder[String]
h3 = h4
^
three errors found