鉴于:
scala> def foo(x: Int)(f: Int => _) = ???
foo: (x: Int)(f: Function1[Int, _])Nothing
Function1[Int, _]
是什么意思?是
_
存在主义?我怎么称呼它?
最佳答案
_
是一种存在类型。特别是未绑定(bind)的通配符。没有任何限制,编译器只会将其推断为 Any
, 但你可以传递任何函数 Function1[Int, A]
,因为唯一的约束是 A <: Any
, 和 Function1
在 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, _]]
.不过,我从来没有真正遇到过这种东西的用途。
关于scala - 了解 `f: Int => _`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35071920/