我在我的代码中导致了一个更难找到我会喜欢的错误,以及我希望将来可以避免的一些错误 . 我预计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 回答
如果使用
final
修饰符定义Vector类,则需要'll get the 1109726 error you' .对我来说,Scala认为你的Option [Vector]可能会以某种方式成为Vector子类型的一个实例 . (这对我来说似乎不可能,但我认为这是工作中的推理 . )使Vector最终排除了看似遥远的可能性 .
所以,如果第一个case语句不可达,那不是因为,正如你所说,Vector不能是Option [Vector]的子类型;但是因为Option [Vector]不能是Vector子类型的实例 . 也许这就是你的意思:)