铸造在equals方法(Casting in equals method)

2019-09-02 15:18发布

我有一个关于重载的问题equals的Java方法。 在我的书中,我有下面的例子:

public class Dog{
     private String name;
     private int age;

public boolean equals(Object obj) {
    if(!(obj instanceof Dog)) return false;
    Dog other = (Dog) obj;                    ---> confused here
    if(this.name.equals(other.name) && (this.age == other.age) {
     return true;
    }
    else {
     return false;
    }
  }
}

我不明白为什么,为什么要参考投射到Dog参考。 如果引用类型不是Dog ,我们返回false。 为什么所有铸造它的麻烦?

Answer 1:

声明的类型objObject ,所以你必须将它转换告诉编译器,这是一个Dog

虽然在逻辑上不能是任何东西在代码中的那点东西,编译器不知道什么逻辑-它只是知道的类型。



Answer 2:

因为你定义为平等自己的参数,你必须确保它们是同一类。 也就是说,除非你比较它们的==方式,那么你需要比较的对象内的一些价值。 为了比较的对象中值,他们需要的是同一类型!

例如,假设你有两个Dog秒。

Dog dog1 = new Dog("Fido");
Dog dog2 = new Dog("Rover");

如果你想测试,如果他们有相同的名字,因为我敢肯定你知道,你不能使用:

if(dog1 == dog2)

所以,你重写equals方法。 但是,因为你要覆盖它,它必须具有相同的方法签名 。 一种方法,签名是通过该方法的名称,和它的参数的数量和类型来定义。 这意味着如果你想覆盖它,它需要有类型的参数Object 。 因此:

if(dog1.equals(dog2))

究其原因,你需要将它转换为使用您正在使用获得任何方法name从狗的值,并比较这些值。

在你的类设计的注意事项

在Java的面向对象编程的约定,当然,是要有AccessorMutator方法来获取和改变一个类变量。 那是:

dog1.name; ----> dog1.getName();

其中getName()看起来像:

public String getName()
{
    return name;
}


Answer 3:

要覆盖equals方法通过检查平等的value 没有reference ..

例如,你希望两只狗相等如果他们有相同 nameage 没有 ,如果他们是由同一人拥有(即不,如果他们引用是等价的)


如果不投,你不能访问狗的nameage的成员



Answer 4:

对于JVM它不是那么明显,obj是狗,所以你必须要明确的跟投。



Answer 5:

因为方法参数obj是实例Object类。 因此,在方法体,你需要投objDog的类型。



Answer 6:

属性nameage都仅针对Dog 。 您不能访问nameage使用obj ,这是一个Object 。 对于恩,下面的代码会生成编译时错误

this.name.equals(obj.name)

我不明白为什么,为什么要参考投射到狗参考。 如果引用类型不是狗,我们返回false。 为什么所有铸造它的麻烦?

因为虽然参考的是Dog它不意味着它是相同的狗。 另一只狗的名字可能不一样的Dog 。 为了比较的nameage其他的Dog与你的Dog ,它必须先投。



Answer 7:

我认为,您的演示类缺少的hashCode()方法。 两个对象只能等于如果它们对一个重写的hashCode()调用是相等的。 (相同的整数值)。

我敢肯定,你既需要保证这个等式。



文章来源: Casting in equals method