若Hashtable<E, ?>.containsKey返回true,能否安全将Object强转为E?
自定义Collection中remove方法的未检查强转是否安全?
结论:常规合规使用场景下是安全的,但存在理论上的风险
核心原因分析
- Hashtable的
containsKey靠对象的equals方法判断匹配,而非类型校验。如果有个非E类型的对象,和某个E元素的equals返回true(比如不合理重写equals的类),那containsKey会返回true,但此时强转(E)o会直接抛出ClassCastException。 - 但如果你的自定义Collection严格遵守泛型规则:底层Hashtable只存E类型元素,且E的
equals方法没有乱重写(不会和非E类型对象判定相等),那这种强转就是安全的。IDE标红是因为编译器没法在编译期确认o的实际类型就是E——毕竟参数是Object类型,编译器做不到精准校验。
代码优化建议
可以保留强转,但建议加@SuppressWarnings("unchecked")消除警告,同时加注释说明强转的前提:
@Override public boolean remove(@NotNull final Object o) { if (underlyingHashTable.containsKey(o)) { // 前提:底层Hashtable仅存储E类型元素,且E的equals不会与非E类型匹配 @SuppressWarnings("unchecked") @NotNull final E item = (E) o; // 执行移除逻辑 underlyingHashTable.remove(item); return true; } return false; }
内容的提问来源于stack exchange,提问作者Govind Parmar
相关产品推荐
相关产品推荐

