gpt4 book ai didi

scala - 为什么抽象覆盖失败

转载 作者:行者123 更新时间:2023-12-02 20:00:32 24 4
gpt4 key购买 nike

我发现使用抽象类型会影响 scala 编译器检测覆盖的能力,并将看似正确的代码解释为错误的代码。

trait I {
type T
def doThings(t : T) : Unit
}
type IT[X] = I { type T = X}

trait A extends I {
override type T = AnyRef
def doThings(t : T) : Unit = println("A")
}

trait Z[X] extends I { this : IT[X] =>
abstract override def doThings(t : T) : Unit = {
println("Z")
super.doThings(t)
}
}

object Use {
val az = new A with Z[AnyRef] {}
}

scala 编译器引发这样的错误:

OverloadAbstract.scala:44: error: object creation impossible, since method doThings in trait Z of type (t: this.T)Unit is marked `abstract' and `override', but no concrete implementation could be found in a base class
val az = new A with Z[AnyRef] {}

表达特质混合和实现之间关系的正确方法是什么?

<小时/>

为了比较代码工作正常:

trait I {
def doThings() : Unit
}

class A extends I {
def doThings() : Unit = println("A")
}

trait Z extends I {
abstract override def doThings() : Unit = {
println("Z")
super.doThings()
}
}

object Use {
val az = new A with Z {}
}
<小时/>

真正的用例是为akka.event.EventBus实现转发器:

object PartialEventBus {
type ApplyEvent[E] = EventBus { type Event = E }
}

trait ForwardEventBus[E] extends EventBus { this : PartialEventBus.ApplyEvent[E] =>
def relay : PartialEventBus.ApplyEvent[E]

abstract override def publish(event : Event) : Unit = {
relay.publish(event)
super.publish(event)
}
}

编译器需要对ForwardEventBus进行类型参数化,以将对象范围的this.Event类型与外部relay.Event类型进行匹配。由于 scala 的路径相关类型限制,如果没有此类提示,编译器将会失败。

最佳答案

也许我很困惑,问题不应该是“为什么抽象覆盖成功?”规范的第 5.2.4 节涵盖了抽象重写,它说:“当与抽象修饰符结合使用时,重写修饰符具有额外的意义。该修饰符组合仅允许用于特征的值成员。”

我希望语言律师能够介入,但看起来这不应该合法。

关于scala - 为什么抽象覆盖失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667140/

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