我有一个矩阵类,它接受一个扩展Number的泛型对象.
例如:
public class Matrix
我试图比较具有相同值的两个矩阵:
Matrix:
row=[0] 273 455
row=[1] 243 235
row=[2] 244 205
row=[3] 102 160
和
Matrix:
row=[0] 273 455
row=[1] 243 235
row=[2] 244 205
row=[3] 102 160
在Matrix类中,我有一个equals方法,如下所示:
public boolean equals(Object obj) {
if (obj == null)
return false;
if (!(obj instanceof Matrix))
return false;
Matrix m = (Matrix) obj;
if (this.rows != m.rows)
return false;
if (this.cols != m.cols)
return false;
for (int i=0; i
T t1 = matrix[i];
T t2 = m.matrix[i];
if (!t1.equals(t2))
return false;
}
return true;
}
这条线路失败了:
t1.equals(t2)
即使两个数字相等.例如“273”和“273”
当我调试equals方法时,它失败了,因为它假设数字是Longs:
这是来自Java SDK Long.class:
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
从本质上讲,它失败了,因为obj不是Long的实例.
我可以轻松地改变我的equals方法:
if (t1.longValue()!=t2.longValue())
return false;
但是我想知道在这种情况下检查相等性的正确方法是什么,以及为什么通用T上的equals方法假设它是Long.
编辑:
我的测试代码定义了”矩阵泛型类型的整数”,这使得我对等式测试(使用Long进行比较)很奇怪.
测试代码:
Matrix matrix1 = new Matrix(4, 3);
matrix1.set(0, 0, 14);
matrix1.set(0, 1, 9);
matrix1.set(0, 2, 3);
matrix1.set(1, 0, 2);
matrix1.set(1, 1, 11);
matrix1.set(1, 2, 15);
matrix1.set(2, 0, 0);
matrix1.set(2, 1, 12);
matrix1.set(2, 2, 17);
matrix1.set(3, 0, 5);
matrix1.set(3, 1, 2);
matrix1.set(3, 2, 3);
Matrix matrix2 = new Matrix(3, 2);
matrix2.set(0, 0, 12);
matrix2.set(0, 1, 25);
matrix2.set(1, 0, 9);
matrix2.set(1, 1, 10);
matrix2.set(2, 0, 8);
matrix2.set(2, 1, 5);
Matrix result1 = new Matrix(4,2);
result1.set(0, 0, 273);
result1.set(0, 1, 455);
result1.set(1, 0, 243);
result1.set(1, 1, 235);
result1.set(2, 0, 244);
result1.set(2, 1, 205);
result1.set(3, 0, 102);
result1.set(3, 1, 160);
Matrix matrix3 = matrix1.multiply(matrix2);
if (!matrix3.equals(result1)) {
System.err.println("Matrix multiplication error. matrix3="+matrix3+" result1"+result1);
return false;
}
Here是没有定义equals()方法的Matrix代码的链接.我还没有检查equals()代码.