如何在Scala中编写类型安全的无操作函数?

时间:2014-04-03 04:47:53

标签: scala

考虑这个声明:

def ignore[U](f: => U):U = ???

是否可以完成此声明,以便ignore函数完全忽略参数f(什么都不做)但仍然编译?

3 个答案:

答案 0 :(得分:3)

实际上,在scala 2.10中,你现在正在编译,因为???会抛出一个NotImplementedException。

正如@connordoyle所指出的那样,欢迎非投掷实现执行f

scala> def ignore[U >: Null](f: => U):U = null
ignore: [U >: Null](f: => U)U

scala> ignore { println("hi"); "yes" }
res11: String = null

答案 1 :(得分:2)

定义已经编译,因为???的类型为Nothing,这是底部类型,因此符合类型参数U

如果你想要一个默认值,通常的习惯用语是:

scala> def ignore[U](f: => U):U = null.asInstanceOf[U]

但也许你想知道为什么-Xlint不会抱怨未使用的函数参数。

我也很想知道。

来自scalac -Y的文档-Ywarn-unused警告当地人,但似乎并不这样。

$ scala -Xlint -Xfatal-warnings 
Welcome to Scala version 2.11.0-RC1 (OpenJDK 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class X { private val x = 7 }
defined class X

scala> :se -Ywarn-unused:true

scala> class X { private val x = 7 }
<console>:7: warning: private val in class X is never used
       class X { private val x = 7 }
                             ^
error: No warnings can be incurred under -Xfatal-warnings.

scala> class X { def f = { val x = 7 ; 5 }
     | }
defined class X

更新

澄清或混淆

scala> class Y { def test(a: String, b: String) {  val b = "foo"; val c = "bar" ; println(s"$a, $b") } }
<console>:10: warning: local val in method test is never used

答案 2 :(得分:0)

当然可以,您可以通过任何其他方式生成U的实例。