类型参数方法
scala 中的方法可以接受一个或多个s ,type parameter
就像 a或一样。class
object
trait
在这种情况下,这意味着可以为一个类型调用相同的方法,该类型T
可能因调用而异,但必须在定义中保持一致。
让我们使用例如
def filter[T](unfiltered: Iterable[T], predicate: T => Boolean): Iterable[T]
该方法希望您传递:
- an Iterable
of T
s ( unfiltered
)
- 一个将 a 转换T
为 a Boolean
( predicate
)的函数,
结果将是另一个Iterable
s 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)
^