gpt4 book ai didi

Scala - 构造函数中无法识别方法

转载 作者:行者123 更新时间:2023-12-01 09:57:25 25 4
gpt4 key购买 nike

我正在尝试扩展 javax.swing.Timer,但它只有一个构造函数,即

Timer(int delay, ActionListener listener) 

我不希望 Scala 中的子类在其构造函数中采用 Java ActionListener。我在very old thread中读到“没有办法直接调用父类(super class)构造函数;你必须传递自己类的主构造函数”,所以看起来我被主构造函数中的 ActionListener 困住了。所以我添加了一个辅助构造函数:

case class TimerEvent (source: AnyRef) extends swing.event.Event

class ScalaTimer2 (delay: Int, listener: java.awt.event.ActionListener)
extends javax.swing.Timer(delay, listener) with swing.Publisher {
outer =>
def this(delay: Int) = {
this(delay, new java.awt.event.ActionListener {
def actionPerformed(e: java.awt.event.ActionEvent) {
publish(TimerEvent(outer)) // <-- publish not recogonized
}
})
// publish(TimerEvent(outer)) // <-- publish recognized here
}
}

但是我收到编译错误错误:未找到:值发布 ...为什么?以及如何解决?

最佳答案

这里实际上有两个问题:在构造函数完成之前,publishouter 都将不可用。 Scala 似乎有一个规则,即在主构造函数完成之前,不能在辅助构造函数中引用 this 实例。例如,以下内容将无法编译:

class Foo (x: Unit) { def this() { this(println(this)) } }

除了辅助构造函数之外,在伴随对象上定义一个工厂方法怎么样?

object ScalaTimer2 {
def apply(delay: Int): ScalaTimer2 = {
lazy val ret: ScalaTimer2 = new ScalaTimer2(delay, new java.awt.event.ActionListener {
def actionPerformed(e: java.awt.event.ActionEvent) {
ret.publish(TimerEvent(ret))
}
})
ret
}
}

请注意,ret 的前向引用需要使用lazy val 而不仅仅是val。大概是在构造函数返回之前才调用 actionPerformed,否则 ret 将因无限递归而无效。

关于Scala - 构造函数中无法识别方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6837410/

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