Guava为什么不提供ImmutableCollections接口?

Pet*_*Pro 9 java immutability guava

Guava的ImmutableCollection子类ImmutableList是(不可扩展的)抽象类,而不是接口。该文件说,这是为了防止外部亚型。另一方面,文档还说

应该被认为是每个重要意义上的接口

但是,在外部进行子类型化的功能不是一种重要的界面含义吗?例如,如果ImmutableList是一个接口,我可以有一个方法签名,例如

public ImmutableList<String> getNames();
Run Code Online (Sandbox Code Playgroud)

(就像Guava的建议一样),然后可以灵活地ImmutableList将来交换自定义实现。但是,由于实际上它是一个抽象类,所以我没有这种灵活性,因此必须绑定到Guava的实现。因此,如果我想保持这种灵活性,就不得不使用更通用的return类型List,该类型不再向调用者传达有关不变性的有用信息:

public List<String> getNames();
Run Code Online (Sandbox Code Playgroud)

那么为什么不从外部进行子类型化很重要?一个答案可能是Guava设计者不信任外部实现者来适当地支持所需的语义,但List实际上它本身具有相当广泛的约定,而且没人阻止这种定制实现。还是还有其他原因?

Col*_*inD 7

这是因为ImmutableList如果是接口,则无法保证类型不变。

不,我认为任何人都无法编写自己的实现的实现interface是所有接口的必要属性。例如,考虑密封类型,它仅允许在同一文件中定义的一组特定实现。他们仍然可以interface秒(有包括建议sealed interface对Java 在这里),而不允许在世界上任何人来创建它们的实现。

对于为什么会认为您可能想要自己定制的超简单的东西(如不可变列表)的实现,我也真的感到很好奇。

  • 关于密封接口的公平点。但是,就您的第一点而言,没有办法保证自定义的Comparator实现正确的compare(),或者确保List正确实现set()的方法。.NET可以作为界面很好。至于为什么我们想要我们自己的实现,它更多地是一个装饰器,但是,从更广泛的意义上讲,如果您同意我们拥有自己的List的实现是可以的,那么似乎并没有牵强,我们想要自己的`ImmutableList`。 (2认同)