为什么API中有一套java.util?

Roa*_*oam 0 java api collections

接口设置java.lang.util具有完全相同的结构集合在同一封装中.

在继承层次,AbstractSet是子既设置类AbstractCollection,这两者都是子来收集.

Set的另一个直接后代是SortedSet,而 SortedSet只扩展Set.

我想知道是,什么是在增益设置java.lang.util -为什么会出现?

如果我没有遗漏任何东西,它不会在API的当前结构或层次结构中添加任何内容.如果AbstractSet没有实现Set但只是扩展了AbstractCollection,而SortedSet 直接扩展了Collection,那么所有内容都是一样的.

我唯一能想到的是Set是出于文档目的.

不应该用于进一步构建/重新构建层次结构 - 这意味着后代的结构修改并且没有意义.

如果我在这里遗漏了什么,我正在寻找验证或反驳.

// ===========================================

编辑:Q是:"为什么设置那里" - 它是什么增加了API的结构?"

显而易见,集合在数学集合中是如何特殊的.

Ste*_*n C 8

在这些方法SetCollection具有相同签名和返回类型,但是它们具有不同的行为契约...从事实得出一组不能包含"相同的"元素不止一次.这就是为什么它们是不同的接口.

它不仅仅是文档.由于Java不执行"duck typing",因此在编译时和运行时类型检查中可以看到Collection和之间的区别Set.

这种区别是有用的.如果只有Collection,那么你将无法编写需要没有重复项的集合作为参数的方法.


你写:

除了评论之外,Set是Collection的复制/粘贴.

我知道.评论是行为合同.他们很关键.没有其他方法可以指定Java 1,2中的行为方式.

参考:


1 - 在一种或两种语言中,您可以在语言本身中指定"合同"的行为方面.埃菲尔是典型的例子......它产生了"按合同设计"的范式.

2 - 事实上,JML系统为Java添加了正式的前置条件,后置条件和不变量,并使用自动化定理证明器对它们进行检查.问题是很难将它与Java语言的类型系统/静态类型检查器完全集成.(当定理证明者说"我不知道"时,你如何静态地检查一些东西...因为它不够智能来证明/反驳代码中的JML断言?)