下面的内容也是那天在旺旺群里讨论的,当时对2.10下这种奇怪的行为很疑惑,以为是2.10因macro或什么其他原因允许编译时这么写呢,现在证实它是2.10编译器的一个bug,对那天在群里的错误言论澄清一下。
对于这段代码:
object A ;
A match { case a:A => println("ok") }
为什么在2.10版本里能够编译通过?在运行时才报错。
scala> object A
scala> A match { case a:A => println(a) }
<console>:9: warning: fruitless type test: a value of type A.type cannot also be a A
A match { case a:A => println(a) }
^
<console>:9: warning: match may not be exhaustive.
It would fail on the following input: A
A match { case a:A => println(a) }
^
scala.MatchError: A$@232b0a52 (of class A$)
at .<init>(<console>:9)
at .<clinit>(<console>)
at .<init>(<console>:7)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
在2.92下编译会报错:
scala> object A
scala> A match { case a:A => println("OK") }
<console>:9: error: not found: type A
A match { case a:A => println("OK") }
^
按理说 A 是单例,不是类型,要匹配应该写 case A
或 case a:A.type
才对。2.92编译报错应该是合理的。2.10下居然允许把单例对象当类型使用,很不合理啊?
scala> object A
defined module A
scala> val x: A = null //在scala2.10.2下编译通过
x: A = null
在 2.11 下又验证了一下,MD原来确实是个bug,瞎猜测一堆其他的因素,实际验证是最靠谱的:
scala> object A
defined object A
scala> val x:A = null // scala2.11.0-M4 版本下
<console>:7: error: not found: type A
val x:A = null
新版本里已经修复了这个bug。