我使用ConcurrentSkipListSet并使用contains方法.
根据JAVA doc for contains方法
如果此set包含指定的元素,则返回true.更正式地说,当且仅当此集合包含o.equals(e)的元素e时才返回true.
但根据我的测试,似乎不使用equals方法,而是比较器是强制性的.请帮助我理解JAVA规范和实现之间的这种异常
ConcurrentSkipListSet
/ **
*如果使用比较器,则返回ComparableusingComparator,否则
*将密钥转换为Comparable,这可能会导致ClassCastException,
*传播回调用者.
* /
私人可比比较(对象键)
at java.util.concurrent.concurrentskiplistmap.comparable(concurrentskiplistmap.java:663)
at java.util.concurrent.concurrentskiplistmap.doGet(concurrentskiplistmap.java:821)
at java.util.concurrent.concurrentskiplistmap.containsKey(concurrentskiplistmap.java:1608)
我正在使用Oracle JDK 7
> ConcurrentSkipListSet是可导航的有序集合,因此所有元素必须保持自然顺序,或者必须指定比较器.
>我认为Javadoc声明不正确,或者至少它具有误导性.在引擎盖下,cslS将委托给concurrentskiplistmap.containsKey,因此它现在不控制contains实现.也就是说,我认为可以有一个论点来澄清javadoc.
编辑:
对于这些对象无法比较的事实,还有一个投掷文档
ClassCastException – if the specified element cannot be compared with
the elements currently in this set
原文地址:https://www.jb51.cc/java/437311.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。