Schemeは3 つの異なる等価演算子を知っています: eq?
、eqv?
、equal?
。詳しくはこちらをご覧ください。つまりeq?
、参照をテストし、値をテストし、リストの値eqv?
をequal?
再帰的にテストします。私は、Scheme の機能を必要とする Java ジェネリックを書きたいと思っていますequal?
。
Javaの equals()メソッドを使用しようとしました。これは値の比較を行うと思ったからです。参照比較には==
演算子が存在equals
し、同じことを行う必要がないからです。しかしequals
、Java では完全に信頼できないため、この仮定は完全に間違っています。値比較を行う場合もあれば、参照比較を行う場合もあります。また、どのクラスが参照比較を行い、どのクラスが値比較を行うのかはわかりません。
これはequals
、ジェネリックでは使用できないことを意味します。これは、ジェネリックがすべての型に対して同じことを行うわけではないためです。また、正しい値比較を実装する型のみが受け入れられるようにジェネリック型を制限することもできません。
問題は、ジェネリックで信頼できる値の比較を行う方法です。自分で最初から書かないといけないの?
ところで、Java の同等の失敗はArrayから始まらないと思います。それは既に Object から始まっています。equals
for two objects が を返すのは間違っていると思いますfalse
。true
値を持たないものの値比較を行う場合、値が異なることはできず、したがってそれらは同じでなければならないため、 を返す必要があります。スキームはそのようにそれを行い、それは完全に合理的です: (equal? (vector) (vector)) -> #t
.