Scala 编写返回=>;T

Scala 编写返回=>;T,scala,Scala,我试图编写一个简单的转换器,将java.util.Function转换为scala.Function1: def toScalaProducer[T](f: JavaFunction0[T]) : => T = => f() 下面是另一个运行良好的变体: def toScalaFunction[T](f: JavaFunction0[T]) : () => T = () => f.apply() 问题是我想将转换后的函数传递到现有的Scala API中,但只接受

我试图编写一个简单的转换器,将
java.util.Function
转换为
scala.Function1

def toScalaProducer[T](f: JavaFunction0[T]) : => T  = => f()
下面是另一个运行良好的变体:

def toScalaFunction[T](f: JavaFunction0[T]) : () => T =
  () => f.apply()
问题是我想将转换后的函数传递到现有的Scala API中,但只接受类型为
=>T
的参数,而不是类型为
()=>T
的参数

有没有办法编写
toScalaProducer
函数?

()=>T
是一个函数的类型,它不带参数,返回类型为
T

=>T
是延迟计算的值
T
的类型。例如:

def myFunc(t: => Int): Unit = {
   // Do something with t
}

myFunc(reallyExpensiveFunctionProducingAnInt())
在这里,
reallycexpensivefunctionproducingant
可能需要很长时间才能运行,但只有在
myFunc
中使用值
t
时才会执行。如果您只是使用type
Int
而不是
=>Int
,则在输入
myFunc
之前会调用它

有关更多信息,请查看此处:


因此,如果您的
toScalaProducer
函数只是执行了Java函数,并且返回值为
T
,那么它应该可以与API配合使用。它只会在需要时执行,因此在许多方面,它的行为就像传递函数一样。

您确定这不起作用吗?这不是一种类型,称为惰性求值,也就是说,作为
a
传入的东西只在方法体中需要时才进行求值,而不是在之前,简而言之,您需要作为类型传入
a
,并且
()=>T
非常好。