java set 泛型 比较 相同 对象_java – 比较“T extends Number”是否相等

我有一个矩阵类,它接受一个扩展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()代码.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值