タイプパラメトリックメソッド
Scalaのメソッドは、のように1つ以上type parameter
のを受け入れることができます。class
object
trait
この場合、呼び出しごとに異なるタイプに対して同じメソッドをT
呼び出すことができますが、定義内で一貫している必要があります。
たとえば使用してみましょう
def filter[T](unfiltered: Iterable[T], predicate: T => Boolean): Iterable[T]
このメソッドは、次のものを渡すことを想定しています。--
an Iterable
of T
s(unfiltered
)
-aT
をa Boolean
(predicate
)に変換する関数で
、結果はsの別Iterable
のものになりますT
。
次に、メソッドはunfiltered
オブジェクトを反復処理し、要素ごとにを適用してpredicate
、フィルタリングする必要があるかどうかを判断します。
結果には、 (つまり、を返す要素)Iterable
を満たす要素のみが含まれます。predicate
t
predicate(t)
true
T
すべてのパラメーターと結果のタイプで一貫している必要があるという制約の下で、任意のタイプのフィルターを呼び出すことができます。
例
//filtered is List(2,3)
val filtered: Iterable[Int] = filter(List(1, 2, 3), (i: Int) => i > 1)
//filtered is List("b", "abc")
val filtered: Iterable[String] = filter(List("a", "b", "abc"), (s: String) => s contains "b")
//filtered is List(Some(1), Some(2))
val filtered: Iterable[Option[Int]] = filter(List(Some(1), Some(2), None), (op: Option[Int]) => op.isDefined)
//you can't call this because T is not the same everywhere it's used
val filtered: Iterable[Int] = filter(List(1, 2, 3), (op: Option[Int]) => op.isDefined)
//this will get you
<console>:12: error: type mismatch;
found : Option[Int] => Boolean
required: Int => Boolean
val filtered: Iterable[Int] = filter(List(1, 2, 3), (op: Option[Int]) => op.isDefined)
^