4

我问了一个关于 findbugs 的相关问题,但让我们问一个更一般的问题。

假设我正在使用一种可以实现多态的面向对象语言。

假设语言支持静态类型检查(例如,Java、C++)

假设该语言不允许参数变化(例如,Java,再次......)

如果我要重写将 Object 作为参数的相等操作,在参数与调用 equals 的 LHS 不同的类型或子类型的情况下,我应该怎么做?

选项 1 - 返回 false,因为对象显然不等于

选项 2 - 抛出一个转换异常,因为如果语言实际上支持方差(这本来是可取的),这将在编译时作为错误被捕获;因此,在运行时检测此错误是有意义的,因为发送另一种类型的情况应该是非法的。

4

5 回答 5

3

我投票支持选项 1。两个不同类型的对象可能相等——例如,int 和 double,如果第一类对象可以有效地相互转换并且在数学上是可比较的。此外,您可能希望考虑不同的子类在某些方面是相等的,但两者都不能转换为另一个(尽管它们可能来自同一个父类)。

于 2008-12-12T23:28:13.907 回答
1

返回 false,因为对象不相等。

我看不出ClassCastException在这里扔 a 会更好。

接口中有一些契约,例如CollectionList实际上依赖于任何能够检查与任何其他对象是否相等的对象。

于 2008-12-12T23:25:33.303 回答
0

这取决于。

SomeClass obj1 = new SomeClass();
object other = (object)obj1;

return obj1.Equals(other); // should return "true", since they are really the same reference.

SomeClass obj1 = new SomeClass();
object other = new object();

return obj1.Equals(other); // should return "false", because they're different reference objects.

class SomeClass { }
class OtherClass { }

SomeClass obj1 = new SomeClass();
OtherClass obj2 = new OtherClass();

return obj1.Equals(obj2); // should return "false", because they're different reference objects.

如果这些类型是两种完全不同的类型,它们不会相互继承,那么它们不可能是相同的引用。

您不应该抛出任何类型的转换异常,因为您接受基对象类作为参数。

于 2008-12-12T23:25:03.990 回答
0

嗯.. 我也喜欢选项 1,原因如下:

1)无论您用来检查的任何条件,这些对象显然都不相等

2)每次进行比较时,抛出 ClassCastException 都需要检查该异常,我认为这会导致代码难以理解或至少更长......

3) 类转换异常只是问题的一个症状,即两个对象不相等,即使在类型级别也是如此。

4)正如上面提到的用户“cbo”,double/int 是相等的,尽管它们的类型不同(4.0 == 4),这也适用于其他类型。

免责声明:我可能会让我的 Python 方式为 Java 辩论着色 :)

于 2008-12-13T00:41:58.033 回答
0

Dobb 博士的 Java Q&A说最佳实践是它们都是同一类型。所以我投票选项1。

于 2008-12-13T00:55:03.420 回答