[解決済み】"比較メソッドはその一般契約に違反する!"
2022-01-19 15:04:40
質問
このコードが例外を投げる理由、"比較メソッドが一般契約に違反している!"、そしてそれを修正する方法を誰か分かりやすく説明してください。
private int compareParents(Foo s1, Foo s2) {
if (s1.getParent() == s2) return -1;
if (s2.getParent() == s1) return 1;
return 0;
}
解決方法は?
コンパレータが他動的でない。
とする。
A
の親である
B
であり、かつ
B
の親となる。
C
. というのも
A > B
と
B > C
ということになるのでしょう。
A > C
. しかし,コンパレータが
A
と
C
の場合、ゼロを返します。
A == C
. これは契約に違反するため、例外がスローされます。
このような異常な振る舞いをするのではなく、それを検知して知らせてくれるのは、むしろライブラリーの良いところです。
の推移性要件を満たす1つの方法として
compareParents()
をトラバースすることです。
getParent()
の連鎖を、直系の先祖だけを見るのではなく、その先の先祖を見るようにします。
関連
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み】imageio.IIOException: 入力ファイルが読み込めない
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み】文字列中の � を置換する方法
-
[解決済み】Javaを包含するクラスではないのか?
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】javaで指定されたファイルが見つからない
-
[解決済み] 解決済み】Javaが「型をインスタンス化できない」というエラーを返す [重複] [重複]
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】Javaでユーザー入力を待機させる方法
-
[解決済み】文字列中の � を置換する方法
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み】javaで無効な文字定数
-
[解決済み】Javaの".class expected "について
-
[解決済み】koch snowflake java recursion
-
[解決済み】CreateProcess error=2, The system cannot find file specified.