为什么Java的TreeSet <E> remove(Object)不带E

Com*_*uid 8 java generics collections treeset

从Java 6 TreeSet<E>文档:

boolean remove(Object o):
    Removes the specified element from this set if it is present.
Run Code Online (Sandbox Code Playgroud)

为什么这会接受Object而不是泛型E?唯一可以添加的对象是E类型,因此唯一的可移动类型应该是E类型.

zen*_*ngr 9

从第一条评论中回答:

神话:

一个流行的神话是它是愚蠢和邪恶的,但由于向后兼容性,它是必要的.但兼容性论点无关紧要; 无论您是否考虑兼容性,API都是正确的.

真正的原因:

统一地,Java Collections Framework(以及Google Collections Library)的方法从不限制其参数的类型,除非必须防止集合被破坏.

在这里阅读更多:为什么Set.contains()采用对象而不是E?


new*_*cct 4

remove(),当给定一个相等的元素时, likeget()才能起作用(以 而言)。在 Java 中,不同类的对象有可能(并且在某些情况下是必需的)相等。因此,您不应该限制类型。.equals()