实例化内部类的奇怪语法 [英] Strange syntax for instantiating an inner class
问题描述
我没想到在这个阶段我会在 Java 中遇到全新的语法,但是你瞧,我只是遇到了一些事情:
I didn't imagine that I would encounter radically new syntax in Java anymore at this stage, but lo and behold, I just encountered something:
确切的上下文和下面的代码应该做什么是无关紧要的——它只是为了提供某种上下文.
我试图在 IT Mill Toolkit 中综合创建一个事件,所以我写了这样一行:
I'm trying to synthetically create an event in IT Mill Toolkit, so I wrote this kind of line:
buttonClick(new Button.ClickEvent(button));
但是,Eclipse 给了我以下错误消息:
But, Eclipse gives me the following error message:
Button 类型的封闭实例不可访问.必须使用 Button 类型的封闭实例限定分配(例如 x.new A(),其中 x 是 Button 的实例).
No enclosing instance of type Button is accessible. Must qualify the allocation with an enclosing instance of type Button (e.g. x.new A() where x is an instance of Button).
当我按如下方式重写上面的行时,它不再抱怨了:
When I rewrite the line above as follows, it doesn't complain anymore:
buttonClick(button.new ClickEvent(button)); // button instanceof Button
所以,我的问题是:后一种语法究竟是什么意思,为什么第一个片段不起作用? Java 抱怨什么,它在第二个版本中做了什么?
So, my question is: What does the latter syntax mean, exactly, and why doesn't the first snippet work? What is Java complaining about, and what's it doing in the second version?
背景信息:Button
和 Button.ClickEvent
都是非抽象公共类.
Background info: Both Button
and Button.ClickEvent
are non-abstract public classes.
推荐答案
内部类(如 Button.ClickEvent
)需要引用外部类(Button
>).
Inner classes (like Button.ClickEvent
) need a reference to an instance of the outer class (Button
).
该语法创建了一个 Button.ClickEvent
的新实例,其外部类引用设置为 button
的值.
That syntax creates a new instance of Button.ClickEvent
with its outer class reference set to the value of button
.
这是一个例子 - 忽略缺少封装等,仅用于演示目的:
Here's an example - ignore the lack of encapsulation etc, it's just for the purposes of demonstration:
class Outer
{
String name;
class Inner
{
void sayHi()
{
System.out.println("Outer name = " + name);
}
}
}
public class Test
{
public static void main(String[] args)
{
Outer outer = new Outer();
outer.name = "Fred";
Outer.Inner inner = outer.new Inner();
inner.sayHi();
}
}
请参阅规范的 第 8.1.3 节 有关内部类和封闭实例的更多信息.
See section 8.1.3 of the spec for more about inner classes and enclosing instances.
这篇关于实例化内部类的奇怪语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!