在scala中是否有可能使用一个方法作为参数?

时间:2018-05-08 16:35:49

标签: scala

我想:

def myMethod[T < ???](f: T): Unit = {
    f()
}

该方法的其余部分并不重要,但可以用某些方式替换???,这样可以确保T是一种方法

如果可能的话,还要进一步确保T的返回类型是定义的吗?

[T < (_*) => Int]

谢谢。

3 个答案:

答案 0 :(得分:1)

定义一个type,如下面的简单示例,可以满足您的需求吗?

type Fcn = String => Int

def myMethod(s: String, f: Fcn): Unit = {
  println(f(s))
}

myMethod("hello", (s: String) => s.length)
// 5

答案 1 :(得分:1)

您可以使用函数文字:

def myMethod[A, T](f: A => T) {
  f(someAValue)
}

或者如果你想要不带参数的函数:

def myMethod[T](f: () => T) {
  f()
}

但是根据您的评论判断,您似乎特别想要引用方法,并查询方法以获取有关其自身的信息,这不是基本Scala的功能。你可以用反射做一些,但反射是最好避免的一个领域。

答案 2 :(得分:0)

从技术上讲,您不能直接传递方法,因为方法不是可以实例化和传递的值。通常传递的是函数实例。当你传递一个方法时,编译器实际上正在为你创建一个函数实例(方法提升或eta-expansion)。

但是,如果您要检查有关该方法的元数据(名称,弃用),那么这不会起作用。为此,你可能正在寻找反思。您可以让您的方法采用java.reflect.Method的实例,但这需要您在呼叫站点获取该实例。