Scala模式匹配编译器警告
发布时间:2020-12-16 10:03:26 所属栏目:安全 来源:网络整理
导读:我在我的代码中导致了一个更难找到我会喜欢的错误,以及我希望将来可以避免的一些错误.我预计 Scala编译器会警告我我的错误(除非我遗漏了什么). 我把它减少到了琐碎的情况: Vector.maybeGetVector match { case v:Vector = true case _ = false}case class V
我在我的代码中导致了一个更难找到我会喜欢的错误,以及我希望将来可以避免的一些错误.我预计
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)) } 我使用通配符代替None的唯一原因是我只想匹配返回的Option的子类型. 我期待编译器警告,因为很容易推断第一个case语句包含无法访问的代码.选项[Vector]不能是Vector的子类型. 奇怪的是,如果我添加以下case语句: case i:Int => false 它引发了一个错误并告诉我需要Option [Vector]. 有没有办法在命名约定之外以这种方式防止程序员错误.唯一可以与Option匹配的东西是Some / None / null.我觉得我错过了一些明显的东西. 解决方法
如果使用final修饰符定义Vector类,则会得到“模式类型与预期类型不兼容”错误.
对我来说,Scala认为你的Option [Vector]可能会以某种方式成为Vector子类型的一个实例. (这对我来说似乎不可能,但我认为这是工作中的推理.)使Vector最终排除了看似遥远的可能性. 所以,如果第一个case语句不可达,那不是因为,正如你所说,Vector不能是Option [Vector]的子类型;但是因为Option [Vector]不能是Vector子类型的实例.也许这就是你的意思:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |