我知道你可以创建一个匿名函数,并让编译器推断它的返回类型:是否可以在Scala中指定一个匿名函数的返回类型?
val x =() => { System.currentTimeMillis }
只为静态类型的缘故,是不是可以指定它的返回类型呢?我认为这会让事情变得更清楚。
我知道你可以创建一个匿名函数,并让编译器推断它的返回类型:是否可以在Scala中指定一个匿名函数的返回类型?
val x =() => { System.currentTimeMillis }
只为静态类型的缘故,是不是可以指定它的返回类型呢?我认为这会让事情变得更清楚。
在我看来,如果你想使事情变得更加清晰最好是通过添加类型注释存在,而不是函数的结果是记录这个标识符x的期望。
val x:() => Long =() => System.currentTimeMillis
然后编译器将确保右边的函数满足这个期望。
val x =() => { System.currentTimeMillis } : Long
这解决了我的问题。这使得比使用函数#方法少得多。 – 2010-09-29 23:28:07
看起来像'val x =()=> Long = {blah}'是一种更直观的语法。感谢你的回答! – wbarksdale 2012-09-26 18:49:51
的Fabian给了直截了当的方式,但如果你的一些其他的方法一样事无巨细糖包括:
val x = new (() => Long) {
def apply() = System.currentTimeMillis
}
或
val x = new Function0[Long] {
def apply() = System.currentTimeMillis
}
甚至
val x = new {
def apply(): Long = System.currentTimeMillis
}
因为
大多数情况下,它如果它从Function下降,则无关紧要,只有它是否适用。
不确定你的意思是*左边的函数符合期望值*,设置结果块的类型也确保了类型是正确的,例如, 'val x =()=> {System.currentTimeMillis}:String'不能编译。或者你的意思是别的吗? – 2010-01-18 19:27:39
杰夫的答案有一个好处,就是您可以预先获得完整类型。如果你有一个很长的(多行)函数定义,那么如果这个类型在开始的时候,它是理解最快的。 Fabian的答案具有重复性较低的优点(尤其适用于简短的(单行)定义,并且可以更快地理解您是否可以一眼看出整个事物)。 – 2010-01-18 19:41:11
哦,现在我看到Geoff的观点,他的类型定义包含了输入类型,这里是'()',并且当函数'()=> System.currentTimeMillis'被赋值给'x'时被检查。 – 2010-01-18 19:46:15