我正在从Java库中读取一些源代码,我在这里很困惑;
此代码来自jaxb库中的Document.java,而 ContentVisitor是同一个包中的接口,我们如何使用新关键字创建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;
}
}
答案 0 :(得分:51)
在代码中,您没有创建接口的实例。相反,代码定义了一个实现接口的匿名类,并实例化该类。
代码大致相当于:
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();
}
答案 1 :(得分:12)
这是有效的。它被称为匿名类。 See here
我们已经看到了定义和实例化匿名类的语法示例。我们可以更正式地表达这种语法:
new class-name ( [ argument-list ] ) { class-body }
或:
new interface-name () { class-body }
答案 2 :(得分:2)
它被称为anonymous
类型/类,它实现了该接口。看看教程 - Local and Anonymous Inner Classes。
答案 3 :(得分:1)
该声明实际上创建了一个新的匿名类,它实现了ContentVisitor
接口,然后是该给定范围的实例,并且完全有效。
答案 4 :(得分:0)
在java http://www.java2s.com/Code/Java/Class/Anonymous-class.htm
中有一种称为匿名类的东西答案 5 :(得分:0)
请注意大括号打开的位置 - 您正在声明一个内部对象(称为anonymous class
),它实现了ContentVisitor
以及当场所需的所有方法!
答案 6 :(得分:0)
它是内联接口实现。这里的想法是让编译器生成一个实现接口的匿名类。然后,对于接口中定义的每个方法,您可以(可选)提供具有合适签名的方法,该签名将用作接口方法的实现。
这是新的Oxygene语法,添加到语言中以允许Oxygene程序员使用这些基于接口的事件,就像Java程序员一样。
答案 7 :(得分:0)
您实际上刚刚以匿名方式提供了此接口的实现。这很常见,当然也是可能的。有关详细信息,请查看here。
答案 8 :(得分:0)
由于问题仍然存在,因此Java 8引入了lambda。我必须提一下。 Lambda与AIC相比有两个优点。
但是lambda和AIC具有不同的范围。您无法创建Lambda实例并获得对Lambda本身的引用。