![](/img/trans.png)
[英]Java: Why does Set<E> mention all methods in Collection<E>
[英]Collection<E> and Set<E> are the same?
我對Java中的這兩個接口有疑問。 設置擴展集合,但不添加任何內容。 它們完全一樣。 我在這里錯過了什么嗎?
設置不允許重復。
這是語義差異,而不是語法差異。
從Collection
的文檔:
集合表示一組對象,稱為其元素。 有些集合允許重復元素而其他集合則不允許。 有些是訂購的,有些是無序的。
從Set
的文檔:
不包含重復元素的集合。 更正式地說,集合不包含元素對
e1
和e2
,使得e1.equals(e2)
和至多一個null
元素。 正如其名稱所暗示的,該界面模擬數學集抽象。
這應該澄清Set
和a(更通用的接口) Collection
之間的區別。
好問題。 我想,與Collection
的概念相比,明確具有Set
概念的接口的主要目的是實際上正式區分這些概念。 假設您正在編寫方法
void x(Collection<?> c);
你不會對你想要得到什么參數有同樣的想法,就好像你在寫作一樣
void x(Set<?> s);
第二種方法期望Collections
包含每個元素最多一次(即Sets
)。 這與第一種方法有很大的語義差異,它不關心它是否接收Sets
, Lists
或任何其他類型的Collection
如果你仔細觀察, Set
方法的Javadoc也是不同的,明確地顯示了在談論Collection
或Set
時發揮作用的不同概念。
集合是一個更通用的界面,包括列表,隊列,集等等。
在這里查看“ 所有已知子接口 ”部分。
一切都在文檔中:
Set - 不包含重復元素的集合。 更正式地說,集合不包含元素對e1和e2,使得e1.equals(e2)和至多一個null元素。 正如其名稱所暗示的,該界面模擬數學集抽象。
和
集合 - 集合層次結構中的根接口。 集合表示一組對象,稱為其元素。 有些集合允許重復元素而其他集合則不允許。 有些是訂購的,有些是無序的。 SDK不提供此接口的任何直接實現:它提供了更具體的子接口(如Set和List)的實現。 此接口通常用於傳遞集合並在需要最大通用性的情況下對其進行操作。
它只是區分實現和未來的使用。
這來自Set理論和字典
此外, Set
文檔定義.equals
的合同,其中“只有其他集合可能等於此集合” 。 如果我們無法通過其類型(使用instanceof
)識別其他集合,則無法實現此功能。
如果它僅用於equals()
, allowsDuplicates()
以為Collection
設置allowsDuplicates()
方法。 但是通常情況下API會說“請不要給我重復”或“我保證這不包含重復”,而在Java中,沒有辦法在方法聲明中說“請僅提供其allowsDuplicates()
方法返回false“。 因此附加類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.