铸造等于方法

use*_*847 10 java casting equals

我有一个关于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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么必须将引用转换为Dog引用.如果该引用不是类型,Dog则返回false.为什么所有的麻烦与铸造呢?

Boh*_*ian 8

声明的类型objObject,所以你必须强制它告诉编译器它是一个Dog.

虽然逻辑上它在代码中的那个点不是任何其他东西,但编译器对逻辑一无所知 - 它只知道类型.

  • 实际上,尽管不同语言的界限不同.例如,在锡兰,演员[没有必要](http://ceylon-lang.org/documentation/1.0/tour/types/). (2认同)

chr*_*her 5

因为您要定义自己的相等性参数,所以必须确保它们是同一类。也就是说,除非您==以某种方式比较它们,否则您需要比较对象内部的某些值。要比较对象内部的值,它们必须是同一类型!

例如,假设您有两个Dog

Dog dog1 = new Dog("Fido");
Dog dog2 = new Dog("Rover");
Run Code Online (Sandbox Code Playgroud)

如果您想测试一下它们是否具有相同的名称,那么我可以确定,您不能使用:

if(dog1 == dog2)
Run Code Online (Sandbox Code Playgroud)

因此,您覆盖了equals方法。但是,由于要覆盖它,因此它必须具有相同的方法签名。方法签名由方法的名称,参数的数量和类型定义。这意味着,如果您想覆盖它,则需要具有type参数Object。因此:

if(dog1.equals(dog2))
Run Code Online (Sandbox Code Playgroud)

您需要将其强制转换为使用name从狗中获取值并比较这些值的任何方法的原因。

关于班级设计的注意事项

面向对象编程以及Java中的约定是必须具有AccessorMutator方法来获取和更改类中的变量。那是:

dog1.name; ----> dog1.getName();
Run Code Online (Sandbox Code Playgroud)

其中getName()的样子:

public String getName()
{
    return name;
}
Run Code Online (Sandbox Code Playgroud)