【发布时间】:2025-11-29 09:10:02
【问题描述】:
class Box {
Closure click
Box () {
click = {}
}
void onClick() {
click()
}
}
class TextBox extends Box {
List<String> content
TextBox (String[] a) {
super()
content = a
}
}
class Main {
public static void main(String[] args) {
Main m = new Main()
}
Main() {
String[] a = ["Hello world!"]
Box b = new TextBox(a)
b.click = {content.add("You clicked this box!")}
b.onClick() //throws Exception
}
}
(显然,上面是一个简化;实际上,这些类涉及更多,并且 onClick() 的调用是由于单击 JFrame)
现在,当我尝试运行它(即运行 Main.main())时,我得到一个异常: 线程“AWT-EventQueue-0”groovy.lang.MissingPropertyException 中的异常:没有这样的属性:类的内容:Main
很明显,由于某种原因,它是在 Main 中搜索 List,而不是在 TextBox 或 Box 中搜索它的调用位置。我也尝试过使用它,所有者和委托,但它们也都指向 Main。 我设法通过将其作为参数来使其工作:
...
void onClick() {
click(this)
}
...
b.click = {it.content.add("You clicked this box!")}
然而,实际上需要将“this”传递给一个闭包,以便它能够知道它是从哪里调用的,这似乎很奇怪。没有更优雅的解决方案吗?另外,即使确实不可能进入 TextBox 范围,是否有可能进入 Box 范围?
【问题讨论】: