在Java equals中,为什么需要强制转换?

问题描述

我编写了一个类来表示线性代数中的矩阵,并使用IntelliJ实现了equals()

生成代码中:

@Override
public boolean equals(Object o) {
    if (this == o) { return true; }
    if (o == null || getClass() != o.getClass()) return false;
    Matrix matrix = (Matrix) o;  // (*)

    for (int i=0; i<this.values.length; i++) {
        // compare entries
    }
    return true;
}

当IntelliJ在其上方检查类是否相同时,为什么将对象转换为在位置(Matrix上键入(*)的对象?

解决方法

稍后将在该方法上强制转换为Matrix,您可以访问其方法/成员并将其用于比较(根据您的逻辑)。

,

一个简单直接的答案是,在Java中,每个类默认情况下都扩展 Object 类。即 Object 类是超类,而 Matrix 是这里的 Object 类的子类。一个简单的比喻是,所有的狗都是动物,而不是所有的动物都是狗。因此,要分配您需要说明的 Object 类的实例,它实际上是 Matrix 类的实例。这就是为什么班上有演员。

,

类型转换对于“分配”是必需的,但对于比较而言则不是。

这是在赋值语句中明确使用类型转换的原因

Matrix matrix = (Matrix) o;

使用==的对象比较通过验证对要比较的对象的引用是否相同来进行。仅比较引用就不需要类型转换。

但是,赋值语句需要为左侧的对象分配空间,以便它可以容纳右侧的对象的所有值。为此,必须在赋值语句中进行类型转换。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...