2016-06-15 2 views
4

ConcurrentSkipListSet을 사용하고 contains 메소드를 사용하고 있습니다. 이 세트로 지정된 요소가있는 경우에ConcurrentSkipListSet.contains에 비교자가 필요하고 같지 않은 이유

는 자바 문서에 따라 경찰에 대한 메소드 진정한

반환이 포함되어 있습니다. 이 세트가 o.equals (e)와 같은 요소 e를 포함하고있는 경우에만 true를 리턴합니다.

하지만 내 테스트에 따르면 equals 메서드는 사용되지 않지만 Comparator는 필수 항목으로 나타납니다. ClassCastException이 발생할 수 필적으로 ComparableUsingComparator를 돌려 나를

ConcurrentSkipListSet

/** * 비교기를 사용하는 경우를 자바 규격 및 구현 사이의 이상을 이해하는 데 도움이됩니다, 다른 * 캐스트 키, * 호출자에게 다시 전달됩니다. */ 전용 필적 비교 (객체 키) java.util.concurrent.ConcurrentSkipListMap.comparable (ConcurrentSkipListMap.java:663) java.util.concurrent.ConcurrentSkipListMap.doGet에서 (ConcurrentSkipListMap.java:821)에서

java.util.concurrent.ConcurrentSkipListMap.containsKey에서 (ConcurrentSkipListMap.java:1608 것은) 내가 오라클 JDK 7

+0

이것은 정렬 된 컬렉션에 대한 정상적인 동작입니다. "TreeSet"의 문서는 아마도 적용 가능할 것이다. "Set 인터페이스를 올바르게 구현하려면 집합에 의해 유지되는 순서 (명시 적 비교기가 제공되는지의 여부)가 equals와 일치해야합니다 (Comparable 또는 Comparator for를 참조하십시오). equals와 일치하는 정확한 정의). " –

+0

CSLS 용 Java 문서는 굵게 표시해야합니다. –

+0

@Louis Wasserman : ['TreeSet.contains'] (https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html#contains-java.lang.Object-)에주의하십시오. 설명서에 오해의 소지가있는 문장이 있으며 분명히 Java 6에서 의도적으로 추가되었습니다. – Holger

답변

2

나는 두 가지 질문/문제가 있다고 생각합니다 사용하고 있습니다 (1) 당사는은을 필요로 포함 않는다 Comparator 또는 Comparable (2) Javadoc은 equals 메소드를 사용할 것이라고 말합니다.

  1. ConcurrentSkipListSet은 탐색 가능한 정렬 된 컬렉션이므로 모든 요소가 자연 순서를 유지해야하거나 비교자를 지정해야합니다.
  2. Javadoc이 잘못 명시되었거나 적어도 오해의 소지가 있다고 생각합니다. 내부적으로 CSLS는 ConcurrentSkipListMap.containsKey에 위임하여 현재는 contains 구현을 제어하지 않습니다. 즉, javadocs를 명확하게하는 인수가있을 수 있다고 생각합니다.

편집 : 이러한 개체

ClassCastException이 비교할 수 없습니다 사실에 대한 throws 문서도 있습니다 - 지정된 요소가 현재 와 요소를 비교하여이에

을 설정할 수없는 경우
+0

Java doc에 실망합니다. 결코 진실이 아니길 기대하지 않았습니다.우리는 그것을 진지하게 받아들이고 모든 것을 검증하기 위해 구현을 통해 디버그하는 경향이 있습니다. –

+0

@Amrish Pandey : 클래스의 목적과 한계를 고려하여 일반적으로 사용하기로 결정하기 전에 강력하게 권장합니다. 하나의 특별한 방법. 평등보다는 오히려 질서에 의존하는이 클래스의 유일한 방법은'포함 '하는 것이 아닙니다. – Holger

+0

@holger 대다수의 사람들은 사용하는 모든 API에 대한 소스 코드를 찾거나 예외적으로 어려운 방법을 배우는 대신 Java doc을 사용합니다. Java doc이 광범위하게 참조되는 것을 고려하면 contains에 대한 정의를 업데이트해야합니다. 그것은 equals() 메서드를 사용한다고 가정합니다. 그렇지 않으면 아무도 상상할 수 없을 것입니다. –

관련 문제