轮询:传递对象时,正确的相等行为与LHS类型不匹配?

时间:2008-12-12 23:19:41

标签: language-agnostic oop equality override

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

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

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

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

如果我重写了将Object作为参数的相等操作,那么在参数不是与被调用的LHS相同的类型或子类型的情况下,我该怎么办?

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

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

我不知道如何抛出ClassCastException会更好。

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

答案 2 :(得分:0)

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

1)根据您用来检查的条件,对象显然不相等

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

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

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

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

答案 3 :(得分:0)

Dr. Dobb's Java Q&A说最佳做法是它们都是同一类型。所以我投票选项1。

答案 4 :(得分: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.

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

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