Java:与新关键字的接口如何可能?

时间:2012-02-06 09:10:27

标签: java interface

我正在从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;
    }
}

9 个答案:

答案 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相比有两个优点。

  • 可读性/介绍函数式编程。
  • 表现cases

但是lambda和AIC具有不同的范围。您无法创建Lambda实例并获得对Lambda本身的引用。