Scala ひと巡り : ジェネリッククラス (Generic Classes)

Java 5 (aka.JDK 1.5 [58])と同じように、Scala は、型がパラメータ化されたクラスを組み込でサポートしています。そのようなジェネリッククラスは、コレクションクラスの開発に特に役立ちます。

次はこのことを示す例です:

class Stack[T] { var elems: List[T] = Nil def push(x: T) { elems = x :: elems } def top: T = elems.head def pop() { elems = elems.tail } }

クラス Stack は、任意の要素型 T の命令型(ミュータブル:更新可能な)スタックをモデル化します。型パラメータの使用により、正しい要素(つまり型が T のもの)だけがスタック上に push されるようにできます。同様に、型パラメータを用いてメソッド top が、与えられた型の要素だけを出力することを表現できます。

次は使用方法を示すいくつかの例です:

object GenericsTest extends Application { val stack = new Stack[Int] stack.push(1) stack.push('a') println(stack.top) stack.pop() println(stack.top) }

次は、このプログラムの出力です。:

97 1

ジェネリック型のサブ型付けは、非変であることに注意してください。これは、もし型 Stack[Char] の文字スタックがあっても、それを型 Stack[Int] の整数スタックとしては使えないことを意味します。それでは、本当の整数を文字スタックに入れることがでてしまうので、不健全でしょう。結論を言えば、た だ S = T の場合に限り、Stack[T] は Stack[S] のサブ型になります。これは非常に制約が厳しいので、Scala は、ジェネリック型のサブ型付けの振る舞いをコントロールする、型パラメータのアノテーション機構 [17]を提供しています。