当我查看Scala库时,我看到这样的代码。为什么要测试 [A] 。
def test[A](block : Int => Unit) : Unit = {
block(10)
}
test { u =>
println(u)
}
我认为这同样有效。它的运行方式相同。
def test(block : Int => Unit) : Unit = {
block(10)
}
我一直很好奇它背后的推理(或设计模式)是什么。感谢。
答案 0 :(得分:7)
类型参数A
在这里没有意义,因为它没有被使用。
def test[A](block: Int => A): A = block(10)
此处A
指定返回类型。
答案 1 :(得分:1)
当函数旁边有泛型类型时,表示该函数是泛型函数。
以下是一个非常简单的例子:
// generic functions which returns type of `A`
def test1[A](x: A) = x
def test2[A](x: => A) = { println("Hello"); x }
val x1 = test1(1)
// x1: Int = 1
val x2 = test1("Hello World")
// x2: java.lang.String = Hello World
val x3 = test2(123.4)
// Hello
// x3: Double = 123.4
val x4 = test2("Test2")
// Hello
// x4: java.lang.String = Test2
如您所见,test1
和test2
的返回类型由其参数类型决定。
以下是另一个用例。
// We could implement `map` function ourself.
// We don't care about what type of List contains,
// so we make it a generic function.
def map[A, B](xs: List[A], f: A => B): List[B] = {
var result: List[B] = Nil
for (i <- xs) {
result ++= List(f(i))
}
result
}
// Now use can map any type of List to another List.
map(List("1", "2", "3"), (x: String) => x.toInt)
//res1: List[Int] = List(1, 2, 3)