封装类型转换在 Java 中不起作用?

问题描述 投票:0回答:1

我正在通过一个示例学习如何进行类型转换,并且我很难理解为什么以下代码不起作用,但下面的解决方案代码却起作用。 为什么需要创建额外的对象? 解释一下,为什么我不能内联或封装类型转换?

不起作用

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;
    }
java casting
1个回答
1
投票

进行以下更改

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() 方法)

这只是您希望表达式执行的顺序,这导致了问题

© www.soinside.com 2019 - 2024. All rights reserved.