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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |