实例化内部类的奇怪语法 [英] Strange syntax for instantiating an inner class

查看:28
本文介绍了实例化内部类的奇怪语法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我没想到在这个阶段我会在 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?

背景信息:ButtonButton.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆