理解equals方法实现:先类型检查再类型转换
为什么要先检查对象类型,再通过类型转换创建新对象?
核心原因:编译时类型与运行时类型的差异
Java里方法参数Object o的编译时类型是Object,哪怕你通过instanceof确认了它的运行时类型是Complex,编译器在编译阶段并不知道这一点——它只认变量声明的类型(Object)。而Object类并没有re、im这些成员变量,所以直接用o.re会触发编译错误。
结合代码分析
看你提供的equals方法代码:
@Override public boolean equals(Object o) { if (o == this) { return true; } // 经过此检查后,我可以确定该对象是Complex的实例。 if (!(o instanceof Complex)) { return false; } // 为何此转换是必要的?我已经知道它是Complex类型,应该拥有Complex的所有成员。 Complex c = (Complex) o; return Double.compare(re, c.re) == 0 && Double.compare(im, c.im) == 0; }
- 先做
instanceof检查:一是过滤掉非Complex类型的对象,保证后续转换不会抛出ClassCastException;二是明确运行时类型符合要求。 - 再做类型转换:把变量的编译时类型从Object转为Complex,这样编译器才会允许你访问Complex类特有的
re和im成员,才能完成后续的相等性判断。
反例:不做类型转换会怎样?
如果删掉转换代码,直接写:
return Double.compare(re, o.re) == 0 && Double.compare(im, o.im) == 0;
编译器会直接报错:Cannot resolve symbol 're',因为Object类根本没有这个属性——编译器不认你通过instanceof做的运行时判断,只认变量声明的编译时类型。
内容的提问来源于stack exchange,提问作者cluster1
相关产品推荐
相关产品推荐

