问题描述
我编写了一个类来表示线性代数中的矩阵,并使用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;
使用==的对象比较通过验证对要比较的对象的引用是否相同来进行。仅比较引用就不需要类型转换。
但是,赋值语句需要为左侧的对象分配空间,以便它可以容纳右侧的对象的所有值。为此,必须在赋值语句中进行类型转换。