scala - 传递一个带有类型参数的函数作为参数

标签 scala type-parameter

我想创建一个函数 g,它将函数 f 作为参数,其中 f 有一个类型参数。我无法获得编译的 g 的签名。一种尝试是这样的:

scala> def mock1[A](): A = null.asInstanceOf[A] // STUB
mock1: [A]()A

scala> def mock2[A](): A = null.asInstanceOf[A] // STUB
mock2: [A]()A

scala> def g0(f: [A]() => A): Int = f[Int]()
<console>:1: error: identifier expected but '[' found.
       def g0(f: [A]() => A): Int = f[Int]()
                 ^

如果我将接受类型参数的函数包装在特征中,我就可以让它工作,如下所示:

scala> trait FWrapper { def f[A](): A }
defined trait FWrapper

scala> class mock1wrapper extends FWrapper { def f[A]() = mock1[A]() }
defined class mock1wrapper

scala> class mock2wrapper extends FWrapper { def f[A]() = mock2[A]() }
defined class mock2wrapper

scala> def g(wrapper: FWrapper): Int = wrapper.f[Int]()
g: (wrapper: FWrapper)Int

scala> g(new mock1wrapper)
res8: Int = 0

有没有一种方法可以在不引入包装器类的情况下完成此操作?

最佳答案

Scala(目前)不支持多态函数值。您有两个选择:

  1. 坚持你的包装特征(可能最容易理解)
  2. 使用来自 Shapeless 的多态函数值(花哨,但可能有点复杂)

关于scala - 传递一个带有类型参数的函数作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16903828/

相关文章:

scala - 我应该在 Scala 类构造函数中声明什么类型的 DateTime 对象?

尽管是实例,但 Java 未经检查强制转换为类型参数警告

scala - 类型参数化和奇怪的转换异常

java - 类<? super T> in getSuperclass() 有意义吗?

haskell - 为什么在 Haskell 中声明参数化数据类型?

scala - ZIO:如何加入 Fibers 以实现永久运行的流程

Scala Seq 与列表性能

scala - 如何对 apache spark scala 中的多列数据进行排序?

scala - 组合 2 个列表的元素

Scala 方法和更高种类的类型参数