我刚刚在我们的代码库中发现了一个静态嵌套接口。

class Foo {
    public static interface Bar {
        /* snip */
    }
    /* snip */
}

我以前从未见过这个。原来的开发人员已经找不到了。因此我不得不问SO:

静态接口背后的语义是什么?如果我移除这些静电,会发生什么变化?为什么会有人这么做?


当前回答

如果你将类Foo改为接口Foo,上面例子中的“public”关键字也将是多余的,因为

在另一个接口中定义的接口将隐式公开 静态的。

其他回答

内部接口必须是静态的,才能被访问。该接口与类的实例无关,而是与类本身相关,因此可以通过Foo访问它。酒吧,像这样:

public class Baz implements Foo.Bar {
   ...
}

在大多数情况下,这与静态内部类没有什么不同。

1998年,Philip Wadler提出了静态接口和非静态接口之间的区别。

在我看来,唯一的区别是 接口非静态是指它现在可以包含非静态的内部 类;所以这个改变不会使任何现有的Java无效 项目。

例如,他提出了“表达问题”的解决方案,即“你的语言能表达多少”的表达与“你试图用你的语言表达的术语”的表达之间的不匹配。

静态和非静态嵌套接口之间的区别可以在他的示例代码中看到:

// This code does NOT compile
class LangF<This extends LangF<This>> {
    interface Visitor<R> {
        public R forNum(int n);
    }

    interface Exp {
        // since Exp is non-static, it can refer to the type bound to This
        public <R> R visit(This.Visitor<R> v);
    }
}

他的建议从未出现在Java 1.5.0中。因此,所有其他答案都是正确的:静态和非静态嵌套接口没有区别。

如果你将类Foo改为接口Foo,上面例子中的“public”关键字也将是多余的,因为

在另一个接口中定义的接口将隐式公开 静态的。

要非常直接地回答你的问题,请查看Map.Entry。

地图。条目

这也可能是有用的

静态嵌套Inerfaces博客条目

Typically I see static inner classes. Static inner classes cannot reference the containing classes wherease non-static classes can. Unless you're running into some package collisions (there already is an interface called Bar in the same package as Foo) I think I'd make it it's own file. It could also be a design decision to enforce the logical connection between Foo and Bar. Perhaps the author intended Bar to only be used with Foo (though a static inner interface won't enforce this, just a logical connection)