java == 复合类型_模式匹配复合类型的值 - 它是编译器错误吗?

在尝试使用复合类型模式匹配值时,我偶然发现了一些神秘的(至少对我而言)编译器行为,我怀疑这可能是编译器错误 . 在提交错误报告之前,如果有比我知识渊博的人能够看到这个并且可能会对正在发生的事情提供一些解释,我会很高兴 .

我们从特征和案例类的一些层次结构开始:

sealed trait A

case class A1() extends A

case class A2() extends A

sealed trait B

我们希望对复合类型的值进行操作: A with B

val a1: A with B = new A1() with B

val a2: A with B = new A2() with B

val as: Seq[A with B] = Seq(a1, a2)

首先,我尝试使用案例类提取器进行模式匹配:

Seq(a1, a2) foreach {

case A1() => println("a1")

case A2() => println("a2")

}

由于类型不匹配,上述内容无法编译:

:21: error: constructor cannot be instantiated to expected type;

found : A1

required: A with B

case A1() => println("a1")

^

:22: error: constructor cannot be instantiated to expected type;

found : A2

required: A with B

case A2() => println("a2")

^

其次,我用实例类型匹配替换了提取器用法:

as foreach {

case _: A1 => println("a1")

case _: A2 => println("a2")

}

以上编译并确实有效,将"a1"和"a2"打印到屏幕上,但发出有关无法访问代码的错误警告:

:23: warning: unreachable code

case _: A2 => println("a2")

令人惊讶的是,使 A 不 sealed 摆脱了警告(尽管第一个模式匹配仍然无法编译) .

所以,问题来了:

第一个模式是否匹配编译?如果没有,那为什么呢?

第二个模式发出的警告是否完全错误或者我是否幸运,并且有时候这种匹配可能会出错?

我应该提交一份错误报告,或者是否错过了's a long known issue I'?

我在 2.11.7 和 2.11.8 上测试了它 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值