scala - 了解 `f: Int => _`

标签 scala

鉴于:

scala> def foo(x: Int)(f: Int => _) = ???
foo: (x: Int)(f: Function1[Int, _])Nothing
Function1[Int, _]是什么意思?

_存在主义?我怎么称呼它?

最佳答案

_是一种存在类型。特别是未绑定(bind)的通配符。没有任何限制,编译器只会将其推断为 Any , 但你可以传递任何函数 Function1[Int, A] ,因为唯一的约束是 A <: Any , 和 Function1A 上是协变的.

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/

相关文章:

scala - 在 SBT 中运行测试套件之前如何启动服务器?

java - 比较 Scala 和 Java Double.NaN

scala - Spark 斯卡拉 GraphX : Creating a Weighted Directed Graph

Java 7 : throw exception without stack trace

scala - 如何在 Slick 中进行聚合查询?

scala - 在等级制度中选择 Actor 的好方法是什么?

scala - 匿名函数作为参数

scala - scala 中反向排序的最佳方法是什么?

java - SBT(简单构建工具): Change the build target "classes" directory

scala - SKEW 连接提示的 Spark Scala 等价物