为什么HashSet <E>不限制包含()和删除()中E的参数类型

use*_*669 6 java

可能重复:
Map.get(Object key)不是(完全)泛型的原因是什么
为什么Java的TreeSet <E> remove(Object)不带E

为什么HashSet不限制E的参数类型:

public boolean contains(Object o)
public boolean remove(Object o)
Run Code Online (Sandbox Code Playgroud)

就像它对add()一样

public boolean add(E e)
Run Code Online (Sandbox Code Playgroud)

我的意思是如果编译器强制只添加类型E的对象,那么该集合不能包含/删除任何其他类型

das*_*ght 4

不同之处在于,添加必须是类型安全的,以保持集合的完整性,而项目检查/删除可以是“类型宽容”的,而不会有损害集合类型安全的风险。换句话说,如果添加了错误类型的元素,集合就会失效;另一方面,如果您检查是否存在错误类型的元素,您将简单地返回一个false. 同样的情况remove:如果您传递不兼容类型的元素,它不会出现在 set +中,因此删除将是无操作。


+除非你通过利用类型擦除的黑客手段将其放入。