Java:与新的关键字接口怎么可能?
我正在阅读Java库的一些源代码,我很困惑,
这个代码来自于jaxb库中的Document.java,而ContentVisitor是一个包中的接口 ,我们如何用一个新的关键字来创build一个Interface的实例? 这不是非法的吗?
public final class Document { . . private final ContentVisitor visitor = new ContentVisitor() { public void onStartDocument() { throw new IllegalStateException(); } public void onEndDocument() { out.endDocument(); } public void onEndTag() { out.endTag(); inscopeNamespace.popContext(); activeNamespaces = null; } }
在代码中,你不是创build接口的一个实例。 相反,代码定义了一个实现该接口的匿名类,并实例化该类。
代码大致相当于:
public final class Document { private final class AnonymousContentVisitor implements ContentVisitor { public void onStartDocument() { throw new IllegalStateException(); } public void onEndDocument() { out.endDocument(); } public void onEndTag() { out.endTag(); inscopeNamespace.popContext(); activeNamespaces = null; } } private final ContentVisitor visitor = new AnonymousContentVisitor(); }
这是有效的。 它被称为匿名类。 看这里
我们已经看到了定义和实例化匿名类的语法的例子。 我们可以更正式地expression这种语法:
new class-name ( [ argument-list ] ) { class-body }
要么:
new interface-name () { class-body }
它被称为anonymous
types/类实现该接口。 看看教程 – 本地和匿名内部类 。
该声明实际上创build了一个新的匿名类,它实现了ContentVisitor
接口,然后实现了该给定作用域的实例,并且完全有效。
在java中有一些叫做匿名类的东西http://www.java2s.com/Code/Java/Class/Anonymous-class.htm
注意大括号在哪里打开 – 您正在声明一个实现ContentVisitor
的内部对象(称为anonymous class
)和现场所需的所有方法!
它是内联接口实现。这里的想法是让编译器生成一个实现接口的匿名类。 然后,对于接口中定义的每个方法,您可以(可选)提供一个具有合适签名的方法,该方法将用作接口方法的实现。
它是新的Oxygene语法,join到语言中,使Oxygene程序员能够像Java程序员一样使用这些基于接口的事件。
你实际上只是以匿名的方式提供了这个接口的实现。 这是相当普遍的,当然可能。 在这里看看更多的信息。