我最近遇到过一种情况,我需要创建一个函数来调用无参数构造函数。以下代码演示
class NoNumber() {}
val create : Unit => NoNumber = Unit => new NoNumber()
val nn = create()
此代码编译并创建NoNumber的新实例,并按预期将其分配给nn。但是,有一些我没想到的事情。
我的第一次尝试(不编译),如下
val create : Unit => NoNumber = () => new NoNumber()
为什么Unit工作而且()在上面的例子中不起作用?我的印象是()是Unit的唯一实例,因此()似乎最有意义。
其次,我在编译代码时看到以下警告
警告:(3,22)通过插入()来适应参数列表 不推荐使用:这不太可能是你想要的。签名: Function1.apply(v1:T1):R给定参数:after adaptation:Function1(():Unit)lazy val nn = create()
这是什么意思?如何更改代码以删除警告?
由于
答案 0 :(得分:6)
Unit => A
和() => A
不是一回事。
Unit => A
是Function1[Unit, A]
的语法糖,是一个返回Unit
的{{1}}参数的函数。您将类型A
与类型为Unit
的值()
混淆。即,你不能说:
Unit
scala> val a: () = ()
<console>:1: error: '=>' expected but '=' found.
val a: () = ()
^
是() => A
的语法糖,是一个返回Function0[A]
的无参数函数。它们很相似,但不完全相同。
至于警告:
A
如果您拥有val create : Unit => NoNumber = Unit => new NoNumber()
,那么val nn = create
实际上就是一个函数nn
。当你有:
Unit => NoNumber
你实际正在做:
val nn = create()
令人困惑,是吗?因此,弃用警告。前者只是将val nn = create.apply(())
传递给()
,但它看起来非常像Function1[Unit, NoNumber]
。你可能想要的是:
Function0