Scala Language
タイプパラメータ化(Generics)
サーチ…
オプションの種類
パラメータ化された型の良い例は、 Option型です。本質的に次のような定義です(型に定義されているいくつかのメソッドがあります)。
sealed abstract class Option[+A] {
def isEmpty: Boolean
def get: A
final def fold[B](ifEmpty: => B)(f: A => B): B =
if (isEmpty) ifEmpty else f(this.get)
// lots of methods...
}
case class Some[A](value: A) extends Option[A] {
def isEmpty = false
def get = value
}
case object None extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
これには、 B
型のものを返すパラメータ化されたメソッドfold
があることもわかります。
パラメータ化されたメソッド
メソッドの戻り値の型は、パラメーターの型によって異なります。この例では、 x
パラメータであり、 A
の一種であるx
型パラメータとして知られています、。
def f[A](x: A): A = x
f(1) // 1
f("two") // "two"
f[Float](3) // 3.0F
Scalaは型推論を使用して戻り値の型を決定します。この型は、パラメータで呼び出されるメソッドを制限します。したがって、注意が必要です。 *
はすべてのタイプA
に対して定義されていないため、以下はコンパイル時エラーです。
def g[A](x: A): A = 2 * x // Won't compile
ジェネリックコレクション
Intsのリストを定義する
trait IntList { ... }
class Cons(val head: Int, val tail: IntList) extends IntList { ... }
class Nil extends IntList { ... }
ブール、ダブルなどのリストを定義する必要がある場合はどうなりますか?
ジェネリックリストの定義
trait List[T] {
def isEmpty: Boolean
def head: T
def tail: List[T]
}
class Cons[T](val head: [T], val tail: List[T]) extends List[T] {
def isEmpty: Boolean = false
}
class Nil[T] extends List[T] {
def isEmpty: Boolean = true
def head: Nothing = throw NoSuchElementException("Nil.head")
def tail: Nothing = throw NoSuchElementException("Nil.tail")
}
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow