scala bug系列:2.10编译器把单例当作类型的bug

下面的内容也是那天在旺旺群里讨论的,当时对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 Acase 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。

Leave a Reply

Your email address will not be published. Required fields are marked *