在创建调用无参数构造函数的函数时使用()vs Unit

时间:2015-08-04 01:10:42

标签: scala

我最近遇到过一种情况,我需要创建一个函数来调用无参数构造函数。以下代码演示

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()

这是什么意思?如何更改代码以删除警告?

由于

1 个答案:

答案 0 :(得分:6)

Unit => A() => A不是一回事。

Unit => AFunction1[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