考虑这个声明:
def ignore[U](f: => U):U = ???
是否可以完成此声明,以便ignore
函数完全忽略参数f
(什么都不做)但仍然编译?
答案 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
的实例。