为什么在接口内声明接口?

Rya*_*yan 4 java

这是java.util.Map的简化版本

public interface Map {
    interface Entry{
        int getKey();
    }

    void clear();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么这样做?

如何实现内部接口?我可以实现内部吗?

Bar*_*zKP 5

这里Map也用作命名空间.这是因为Entry不属于全球范围 - 还有许多其他实体Entries是必要Map的条目.这表示Entry代表与之相关的条目Map.


Fri*_*itz 5

我将会......在这里非常理论化......所以请保持开放的心态.一个单独的Entry接口会将该概念与其意图的上下文分离.不要只考虑界面,而是考虑它的实现.以内容中Entry定义的内部静态类为例HashMap:

static class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;
    final int hash;

    (...)
}
Run Code Online (Sandbox Code Playgroud)

这个Entry类不打算在外面使用,它实现的接口代表一个服务契约,仅供Maps中的内部使用,特别是因为它Map是一个接口本身,需要一点抽象,让特定的实现定义条目的类型他们会用.

事实上,我敢打赌你在想"当然,但在许多情况下都可以使用一个条目,特别是当你需要一个Key - Value对"时.事实上,这是正确的,但我个人同意当前的设计决定,因为它提供了Map在一个地方实现一切所需的一切.