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

oop – 重写Companion对象值和Scala MatchError

发布时间:2020-12-16 18:38:17 所属栏目:安全 来源:网络整理
导读:有人可以澄清为什么以下代码导致MatchError?在这种情况下,MatchError意味着什么? class A { def g = A.f}object A { val f = "Object A"}class B extends A { override val A.f = "Object B"}val b = new Bb.g 鉴于这不起作用,有没有办法覆盖与此类似的伴
有人可以澄清为什么以下代码导致MatchError?在这种情况下,MatchError意味着什么?

class A {
  def g = A.f
}

object A {
  val f = "Object A"
}


class B extends A {
  override val A.f = "Object B"
}

val b = new B
b.g

鉴于这不起作用,有没有办法覆盖与此类似的伴侣对象val或def?

解决方法

首先,看看为什么你会看到MatchError.对象(A.f)上的值被认为是一个稳定的标识符(如Scala引用所示,“稳定成员是由对象定义或非易失性类型的值定义引入的成员”).

这是typer输出的样子:

object A extends scala.AnyRef {
    ...
    private[this] val f: String = "Object A";
    <stable> <accessor> def f: String = A.this.f
}

当在赋值中使用时,编译器“desugars”将此稳定标识符(它是稳定的必要条件)赋值给模式匹配:

<synthetic> private[this] val x$1: Unit = ("Object B": String("Object B") @unchecked) match {
    case A.f => ()
}

它不能将“对象B”与模式“对象A”匹配,因此它会抛出MatchError.

对于较大的问题:您不能/不应该覆盖伴随对象上的值和方法.多态性适用于类及其实例,而不适用于静态方法或值.可能有更好的方式来考虑你的程序,不涉及覆盖伴随对象上的vals / defs.

(编辑:李大同)

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

    推荐文章
      热点阅读