Tutorial_8


8 ジェネリシティ

このチュートリアルで調べる最後の Scala の特徴はジェネリシティです。Java プログラマは、Java にジェネリシティが無いことによる問題、Java 1.5 で検討される欠点、についてよく知っているに違いありません。

ジェネリシティとは型でパラメータ化されたコードを書ける能力です。例えば、連結リストのライブラリを書こうとしたプログラマは、リストの要素にどの型を使うか決めるという問題に直面します。このリストは色々な場面で使うつもりですから、要素の型を例えば Int とか決めることは不可能です。それでは全く恣意的かつ制限が強すぎるでしょう。

Java プログラマは、全てのオブジェクトのスーパータイプである Object の助けを借ります。しかしこの解決方法は理想とはほど遠いものです。なぜなら、基本型 (int, long, float など) には使えませんし、プログラマはたくさんの動的な型キャストを挿入しなければならないからです。

Scala ではこの問題を解決するためにジェネリッククラス(とメソッド)を定義できます。もっとも簡単なコンテナクラスである参照の例を見てみましょう。参照は、空であるか何かの型のオブジェクトを指しています。

class Reference[T] {
  private var contents: T = _
  def set(value: T) { contents = value }
  def get: T = contents
}
Reference クラスはその要素の型である型 T でパラメータ化されます。この型はクラスの本体で、変数 content 、set メソッドの引数、get メソッドの戻り値、の型として使われます。

上記のサンプルコードで、Scala の変数が導入されていますが、これ以上の説明は不要でしょう。ただしその変数の初期値が _ として与えられていることは興味深いでしょう。_ はデフォルト値を表します。デフォルト値は、数値型に対しては 0 、Boolean 型に対しては false、Unit 型に対しては () 、全てのオブジェクト型に対しては null です。

この Reference クラスを使うためには、型パラメータ T 、すなわち cell に格納される要素型を指定する必要があります。例えば、整数を格納する cell を作るには下記のようにします。

object IntegerReference {
  def main(args: Array[String]) {
    val cell = new Reference[Int]
    cell.set(13)
    println("Reference contains the half of " + (cell.get * 2))
  }
}
この例で見たように get メソッドの戻り値を、整数として使う前に値をキャストする必要はありません。また、整数でない何かをその cell に代入することはできません。なぜなら整数を格納すると宣言されているからです。


名前:
コメント:

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2010年10月21日 13:19
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。