Scheme知道三种不同的等价运算符:eq?
, eqv?
, equal?
。请参阅此处了解详细信息。简而言之:eq?
测试引用,eqv?
测试值并equal?
递归测试列表的值。我想编写一个需要 Scheme 功能的 Java 泛型equal?
。
我尝试使用 Java 的equals()方法,因为我认为它会进行值比较,因为对于引用比较,==
运算符存在并且不需equals
要这样做。但是这个假设是完全错误的,因为equals
在 Java 中是完全不可靠的。有时它会进行值比较,有时会进行参考比较。并且不能确定哪个类进行引用比较,哪个类进行值比较。
这意味着equals
不能在泛型中使用,因为泛型不会对所有类型都执行相同的操作。而且也不可能以只接受实现正确值比较的类型的方式限制泛型类型。
所以问题是:如何在泛型中进行可靠的值比较?我必须从头开始自己编写吗?
顺便说一句:我认为 Java 的同样失败并不是从Array开始的。它已经从 Object 开始。我认为equals
对于两个对象返回是错误的false
。它必须返回true
,因为如果您对没有值的东西进行值比较,则值不能不同,因此它们必须相同。Scheme 就是这样做的,而且是完全合理的:(equal? (vector) (vector)) -> #t
.