首页 文章

Scala模式匹配编译器警告

提问于
浏览
4

我在我的代码中导致了一个更难找到我会喜欢的错误,以及我希望将来可以避免的一些错误 . 我预计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 回答

  • 5

    如果使用 final 修饰符定义Vector类,则需要'll get the 1109726 error you' .

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

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

相关问题