我正在通过一个示例学习如何进行类型转换,并且我很难理解为什么以下代码不起作用,但下面的解决方案代码却起作用。 为什么需要创建额外的对象? 解释一下,为什么我不能内联或封装类型转换?
不起作用
public boolean equals(Object obj)
{
if(size==(Creature)obj.getSize())
return true;
return false;
}
有效
public boolean equals(Object obj)
{
Creature other = (Creature)obj;
if(size==other.getSize())
return true;
return false;
}
进行以下更改
public boolean equals(Object obj)
{
if(size==((Creature)obj).getSize())
return true;
return false;
}
为什么需要它,在你的情况下,你使用了
(Creature)obj.getSize()
,它在类Object的对象上调用.getSize(),它没有方法.getSize(),或者即使它有,返回值被转换为 Creature 类,这又会导致问题
但是当您使用
((Creature)obj).getSize()
时,通过遵循运算符的优先级(类似于 BODMAS ),obj 会转换为类 Creature,其中包含 .getSize() 方法,从而提供解决方案
为什么您的以下或下一个代码有效?,因为在将 other.getSize() 与大小进行比较之前,在前面您将 obj 转换为 Creature 类
Creature other = (Creature)obj;
,
(Creature)obj.getSize()
=> 这里首先执行 obj.getSize(),然后执行显式转换
((Creature)obj).getSize()
=> 这里首先执行显式转换,然后调用 .getSize() 方法,(与第二个代码的工作原理相同,在其中显式转换并调用 .getSize() 方法)
这只是您希望表达式执行的顺序,这导致了问题