理解`f:Int => _`

时间:2016-01-28 20:59:54

标签: scala

假设:

scala> def foo(x: Int)(f: Int => _) = ???
foo: (x: Int)(f: Function1[Int, _])Nothing

Function1[Int, _]是什么意思?

_是一个存在主义者吗?我怎么称呼它?

1 个答案:

答案 0 :(得分:4)

_是一种存在主义类型。特别是未绑定的通配符。没有任何界限,编译器只会将其推断为Any,但您可以传递任何函数Function1[Int, A],因为唯一的约束是A <: Any,而Function1是covariant over A

scala> def foo(x: Int)(f: Int => _) = f(x)
foo: (x: Int)(f: Function1[Int, _])Any

scala> def f(i: Int): Int = i
f: (i: Int)Int

scala> foo(1)(f)
res2: Any = 1

虽然有效,但f的结果是Any,这使得它不太有用。

你可以为它添加一个上限,并推断出该界限:

scala> def foo(x: Int)(f: Int => _ <: Int) = f(x)
foo: (x: Int)(f: Function1[Int, _ <: Int])Int

scala> foo(1)(f)
res6: Int = 1

我想如果你有一个具有相同参数类型但不完全相同的返回类型的函数列表,这可能会有用吗?即List[Function1[Int, _]]。不过,我从来没有真正遇到过这样的事情。