Locked History Actions

Diff for "scala/typeSystem"

Differences between revisions 2 and 3
Deletions are marked like this. Additions are marked like this.
Line 38: Line 38:
Javaでは Javaでの上限境界指定は以下のようなものだった
Line 41: Line 41:
    public void add(T animal) {
    }
...
Line 44: Line 43:
....
Line 48: Line 46:
Scalaでは Scalaでは以下になる
Line 51: Line 49:
  def add(a:T) { } ...

Scalaの型システム

単純な型パラメータ

Javaでは以下のように書ける。

class Animal { }
class Fish extends Animal { }
class Zoo<T> {
    public void add(T animal) {
    }
}
...
        Zoo<Animal>zoo = new Zoo<Animal>();
        zoo.add(new Fish());
...

これと等価な(たぶん)Scalaコードは以下。

class Animal
class Fish extends Animal;
class Zoo[T] {
  def add(a:T) { }
}

val zoo = new Zoo[Animal];
zoo add new Fish

上限境界と下限境界

上のコードのままだと、Animal以外のZooの作成が可能になってしまうし、そもそもZooクラスの中でAnimalのメソッドを呼び出せない。なぜなら、Tという型に制限がないので、IntegerやDoubleという型パラメータを指定してZooを作成できてしまうからである。

  Zoo<Integer>zooInt = new Zoo<Integer>(); // 可能だが???

そこで、TというクラスをAnimalあるいはそのサブクラスに制限する。これを上限境界という。

Javaでの上限境界指定は以下のようなものだった

class Zoo<T extends Animal> {
...
}
Zoo<Fish>fishZoo = new Zoo<Fish>(); // OK
Zoo<Integer>intZoo = new Zoo<Integer>(); // エラー

Scalaでは以下になる

class Zoo[T <: Animal] {
...
}
....
val fishZoo = new Zoo[Fish]; // OK
val intZoo = new Zoo[Int]; // エラー