我正在浏览Scala for the Impatient,但不幸的是,它假定了以前的Java经验并且理解了[T]
如何在这里使用:
object Iterables {
def filter[T](unfiltered: Iterable[T], predicate: T => Boolean): Iterable[T] = {...}
def find[T](iterable: Iterable[T], predicate: T => Boolean): T = {...}
}
[T]
和T
的每个实例的语法都非常混乱。当它直接列在函数名称后面时有什么意义,例如filter[T]
。我理解在参数列表中,我们正在寻找类型为T
的Iterable。但如果T是一个类型,predicate: T => Boolean
是什么意思?
答案 0 :(得分:5)
此声明:
def filter[T](unfiltered: Iterable[T], predicate: T => Boolean): Iterable[T]
可以理解如下:对于任何类型T
,此函数接受该类型的Iterable
和该类型的函数Boolean
。最后它返回相同类型的Iterable
。
上面的类型基本上意味着:您可以使用Iterable[String]
,Iterable[Date]
,Iterable[Foo]
调用此函数 - 您就明白了。但无论你选择哪种类型,它都必须在所有地方都一样。例如:
val result = filter(List("a", "bb", "ccc"), (s: String) => s.length() > 1)
是对的。但这不是:
val result: Seq[Int] = filter(List("a"), (s: String) => s.length() > 1)
答案 1 :(得分:2)
类型参数化方法
scala中的方法可以接受一个或多个type parameter
,就像class
,object
或trait
一样。
在这种情况下,它意味着可以为类型T
调用相同的方法,该类型可能因调用而异,但必须在定义中保持一致。
让我们使用例如
def filter[T](unfiltered: Iterable[T], predicate: T => Boolean): Iterable[T]
该方法希望您通过:
- Iterable
T
(unfiltered
)的T
- 将Boolean
转换为predicate
(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)
^
您可以为任何类型{{1}}调用过滤器,其约束条件是所有参数和结果类型必须一致。
<强>实施例强>
{{1}}
答案 2 :(得分:0)
它被称为泛型方法。
(在java,C#和C ++中也可以使用类似的功能(称为模板功能))