2

在斯卡拉2.10.0-M4为什么Scala 2.10在匹配singleton类型时给出'匹配可能不完全'的警告?

object X 
def f(e: Either[Int, X.type]) = e match { 
    case Left(i) => i 
    case Right(X) => 0 
} 

给出:

warning: match may not be exhaustive. 
It would fail on the following input: Right(<not X>) 

这是正确的吗?当然这场比赛实际上是详尽无遗的。

(与此同时,在斯卡拉2.9.X我们得到

error: pattern type is incompatible with expected type; 
found : object X 
required: X.type 
      case Right(X) => 0 

这大概是一个错误。)

+0

这似乎喜欢的类型检查不在这种情况下区分单类型从普通的类型。 反正我猜你应该知道Right(_)上的匹配也是安全的,因为Right只能是X.type类型,对吧? – Kaito

+0

是的,这是我的'解决方法'。 –

+0

打开一个bug报告它可能不是一个bug,但是尽管如此,穷举检查是Scala 2.10上的最新代码,这只是我想像的Adriaan所期望的反馈。 –

回答

5

可悲的是,还有一些居住在X.type两个值。一个是明显的,X,另一个当然是null。因此,你的模式已经错过的情况下:(

+1

虽然正确,但这是类型的东西克尔克通常会忽略,因为每次都必须考虑它。他可以在Right(_)上匹配,如果传递null,仍然会出现匹配错误,这次没有来自编译器的警告。 – Kaito

+0

事实上,编译器并不在意没有'case null => ...',因为它忽略了密封类的可能性。但是,当编译器进入穷举检查模式时,显然(我对此并不积极!),它也会检查所有的子模式。我想你可以称之为一个bug:/ – mergeconflict

+1

在我的测试中,当传递Right(null)时也会引发匹配错误,即使您不尝试访问内容。使用非密封类给出相同的行为,没有警告和匹配错误。 对我来说,编译器不会提醒我这件事似乎很正常。 GHC也没有警告底部。 – Kaito