Scala模式匹配编译器警告

时间:2012-07-07 05:01:35

标签: scala

我在我的代码中导致了一个更难找到我会喜欢的错误,以及我希望将来可以避免的一些错误。我预计Scala编译器会警告我我的错误(除非我遗漏了什么)。

我把它简化为琐碎的案例:

Vector.maybeGetVector match {
  case v:Vector => true
  case _ => false
}

case class Vector(x:Int, y:Int)

object Vector {
  def maybeGetVector : Option[Vector] = Some(new Vector(1,2))
}

我使用wildcard代替None进行摔倒的唯一原因是我只想匹配返回的Option的子类型。

我期待编译器警告,因为很容易推断第一个case语句包含无法访问的代码。 Option[Vector]不能是Vector的子类型。

奇怪的是,如果我添加以下case语句:

 case i:Int => false

它引发了错误并告诉我Option[Vector]是必需的。

是否有一种方法可以在命名约定之外以这种方式防止程序员错误。与Option匹配的唯一内容是Some/None/null。我觉得我错过了一些明显的东西。

1 个答案:

答案 0 :(得分:5)

如果使用final修饰符定义Vector类,您将得到“模式类型与预期类型不兼容”错误。

对我来说,Scala认为你的Option [Vector]可能会以某种方式成为Vector子类型的一个实例。 (这对我来说似乎不可能,但我认为这是工作中的推理。)使Vector最终排除了看似遥远的可能性。

所以,如果第一个案例陈述不可达,那不是因为,正如你所说,Vector不能是Option [Vector]的子类型;但是因为Option [Vector]不能是Vector子类型的实例。也许这就是你的意思:)。

相关问题