【发布时间】:2015-04-18 07:34:20
【问题描述】:
代码如下:
scala> def f(x:Int => Unit):Unit = 1
<console>:7: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
def f(x:Int => Unit):Unit = 1
^
f: (x: Int => Unit)Unit
scala> f(_=>2);
<console>:9: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses
f(_=>2);
^
scala> f(_=>List(1,2));
上面所有三个表达式都在 REPL 中工作(带有一些警告),但它们看起来有点混乱..
在第一个表达式中,f 的返回类型是Unit,它是AnyVal 的子类型而不是Int 的超类型,因此,我不明白为什么1 可以是用作返回值。
第二个表达式中_=>2也使用2而不是Unit作为返回值,与定义冲突。
在第三个表达式中,_=> List(1,2) 甚至使用 List,AnyRef 的子类型作为返回值,但 REPL 仍然没有抱怨这一点..
有人知道为什么Unit 可以容忍这里的非子类型转换吗?谢谢!
【问题讨论】:
-
请注意,您可以使用
-Ywarn-value-discard收到警告。
标签: java scala types functional-programming type-inference