我正在使用ConcurrentSkipListSet并使用contains方法。
根据JAVA doc for contains方法
如果此set包含指定的元素,则返回true。更正式地说,当且仅当此集合包含o.equals(e)的元素e时才返回true。
但根据我的测试,似乎不使用equals方法,而是比较器是强制性的。请帮助我理解JAVA规范和实现之间的这种异常
ConcurrentSkipListSet
/ ** *如果使用比较器,则返回ComparableUsingComparator, else *将密钥转换为Comparable,这可能导致ClassCastException, *传播回调用者。 * / private Comparable comparison(对象键)
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
答案 0 :(得分:3)
我认为有两个问题/疑虑,(1)为什么包含需要Comparator
或Comparable
。 (2)Javadoc说它将使用equals
方法。
编辑:
还有一个throws
doc,因为这些对象不具有可比性
ClassCastException - 如果无法与指定的元素进行比较 当前在这个集合中的元素