Java 为什么可以';我的类是否实现了内部声明的接口?

Java 为什么可以';我的类是否实现了内部声明的接口?,java,interface,implementation,inner-classes,Java,Interface,Implementation,Inner Classes,我刚刚遇到了一个行为,我最初认为这是Eclipse中的一个bug。考虑这个简单的类: public class Foo { public static interface Callback { public void onAction(); } } 这是完全正确的。然而,这并不是: public class Foo implements Callback { public static interface Callback { publi

我刚刚遇到了一个行为,我最初认为这是Eclipse中的一个bug。考虑这个简单的类:

public class Foo {
    public static interface Callback {
        public void onAction();
    }
}
这是完全正确的。然而,这并不是:

public class Foo implements Callback {
    public static interface Callback {
        public void onAction();
    }

    public void onAction() { /*some implementation*/ }
}
但这也是正确的:

public class Foo {
    public static interface Callback {
        public void onAction();
    }

    private final Callback mCallback = new Callback() {
        public void onAction() { /*some implementation*/ }
    };
}

如果Java可以通过让我自己实现来保存它,为什么Java会强迫我“浪费”一个成员呢?我很清楚将这个接口放在自己的文件中的“变通方法”,但出于好奇:这有什么原因不起作用吗?

在第二种情况下,因为签名是在类主体之前检查的,当编译器试图编译
Foo
类时,
回调
接口尚未定义。

使用此代码

public class Foo implements Callback{

public static interface Callback{
    public void onAction()
}

public void onAction(){//some implementation}
}
什么是
回调
?编译器(顺便说一句,它不同于
Eclipse
,)不知道什么是
Callback


您在使用后定义了
Callback
接口。

AFAIK,您无法在接口上执行新操作,因此new Callback()无效。我不确定这不起作用的官方理由,但是我看不出有什么理由让一个类实现它所包含的接口——为什么不用试图放入接口的方法定义这个类呢?在这种情况下,你为什么想要一个接口?@MiguelPrz他正在使用
{}
@MiguelPrz创建接口的内联实现实际上,这是在实例化一个实现
回调的匿名类。它是有效的,并且可能是有用的。对内部接口和它们的语义有一些很好的解释。难道编译器不能向前看并得到所有类的列表吗?!感觉有点愚蠢这是一个不幸的陈述,在Java语言中,文本上的“before”和“after”与其他一些语言不相关。这里的“before”和“after”应理解为“编译器可以达到”。编译器首先尝试编译类头,然后是类体(可能是为了消除重新定义检查的机会…),因此在头中不能使用驻留在体中的定义。