加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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子类型的实例.也许这就是你的意思:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读