gpt4 book ai didi

oop - 重写伴随对象值和 Scala MatchError

转载 作者:行者123 更新时间:2023-12-02 15:56:44 25 4
gpt4 key购买 nike

有人可以澄清为什么以下代码会导致 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 引用所述,“稳定成员是由对象定义或非 volatile 类型的值定义引入的 [...] 成员”)。

这是打字机输出的样子:

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

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

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

它无法将“对象 B”与模式“对象 A”进行匹配,因此会抛出 MatchError

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

关于oop - 重写伴随对象值和 Scala MatchError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16306555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com