2016-06-15 4 views
4

ConcurrentSkipListSetを使用し、containsメソッドを使用しています。以下のためのJAVAドキュメントを1としてConcurrentSkipListSet.containsにはコンパレータが必要であり、等しくない理由

は、このセットは、指定された要素が含まれている場合の方法

はtrueを返します。正式には、このセットにo.equals(e)などの要素eが含まれている場合にのみtrueを返します。

私のテストでは、equalsメソッドは使用されていませんが、Comparatorは必須です。 ClassCastExceptionが発生することがあり匹敵するようComparableUsingComparatorを返し、私は

ConcurrentSkipListSetの

/** *コンパレータを使用している場合をJAVAの仕様と実装の間のこの異常を理解してください、それ以外の *キャストキー、 *呼び出し元に伝播されます。 */ プライベート匹敵する同等の(オブジェクトキー)java.util.concurrent.ConcurrentSkipListMap.comparable(ConcurrentSkipListMap.java:663)java.util.concurrent.ConcurrentSkipListMap.doGetで (ConcurrentSkipListMap.java:821)で

java.util.concurrent.ConcurrentSkipListMap.containsKeyで (ConcurrentSkipListMap.java:1608)

私はOracleのJDK 7

+0

これは、ソートされたコレクションの正常な動作です。 「TreeSet」のドキュメントは、おそらく適用可能です:「セットによって維持される順序(明示的コンパレータが提供されているかどうかにかかわらず)は、Setインタフェースを正しく実装するためにはequalsと一貫していなければなりません(ComparableまたはComparator for ) –

+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

を使用しています私は2つの質問/懸念があると思い、(1)なぜ必要が含まれていませんComparatorまたはComparable。 (2)Javadocは、equalsメソッドを使用すると述べています。

  1. ConcurrentSkipListSetはナビゲーション可能な順序付けされたコレクションなので、すべての要素が自然順序を維持する必要があります。または、コンパレータを指定する必要があります。
  2. 私はJavadocが間違って記述されていると思うし、少なくとも誤解を招いていると思う。ボンネットの下では、CSLSはConcurrentSkipListMap.containsKeyに委譲します。そのため、現在はcontains実装を制御しません。つまり、javadocsを明確にするための議論があると思います。

EDIT: 事実をthrowsドキュメントもあり、これらのオブジェクトは

にClassCastException比較することはできません - 現在この中 要素が

を設定して指定された要素を比較できない場合
+0

ここにJavaのdocに失望しています。それはあまり真実でないとは決して考えなかった。私たちは真剣にそれを取る傾向があり、すべてを検証するために実装をデバッグすることはほとんどありません。 –

+0

@Amrish Pandey:クラスの一般的な目的や制限を検討してから、使用することを決める前に1つの特定の方法。これは、等級ではなく秩序に頼っているこのクラスの唯一のメソッドが 'contains'であるかのようではありません。 – Holger

+0

@holger大部分の人は、使用するすべてのAPIのソースコードを調べたり、例外を使って難しい方法を学ぶ代わりに、Javaのdocを使用します。 Java docが広く参照されていることを考慮すると、containsの定義を更新する必要があります。それはequals()メソッドを使用することを明示しています。それ以外の人は想像もしません。 –

関連する問題