これは私が Java (1.6) で見た中で最もクレイジーなことです:
Set<ActionPlan> actionPlans = assessment.getActionPlans();
//getActionPlans() returns a java.util.HashSet<ActionPlan>
ActionPlan actionPlan = actionPlans.iterator().next();
assertTrue(actionPlan1.equals(actionPlan));
assertEquals(actionPlan1.hashCode(), actionPlan.hashCode());
assertTrue(actionPlans.contains(actionPlan1));
最初の 2 つのアサートは成功しますが、最後のアサートは失敗します。
ActionPlan クラスと Assessment クラスの詳細については説明しません。問題ではないからです。equals と hash が失敗する場合、contains メソッドは失敗します。
Java が壊れているなどと言っているのではありません。おそらく私のコードで何かおかしなことが起こっているのでしょう。
私は経験豊富な Java プログラマーであり、equals と hashCode を実装するためのすべきこととすべきでないことを認識しています。したがって、私のコードに何かが欠けている場合、それは明白なものではありません。
誰もが不可解なものを見たことがありますか?
編集
私は自分のコードでいくつかの調査を行いましたが、問題は休止状態にあると思います。作成後、失敗したアサートが呼び出されるまで、コードのさまざまな部分で ActionPlan オブジェクトの hashCode をログに記録しました。変わりません。
また、assessment.getActionPlans() によって返されるクラスを確認しましたが、次のとおりです。
org.hibernate.collection.internal.PersistentSet
この Set の実装は equals または hashcode を適切に使用していないと思いがちです。
誰かがそれについて洞察を持っていますか?