型パラメータ
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