我想检查两个Java对象是否相等。此检查也适用于数组。我写了这个:
/** Check if two Java objects are equal. */
private static <T> boolean equal (T a, T b)
{
if (a == null)
if (b == null)
return true;
else
if (b.getClass().isArray())
return Arrays.equals(b, a);
else
return b.equals(a);
else
if (a.getClass().isArray())
return Arrays.equals(a, b);
else
return a.equals(b);
}
但调用Arrays.equals
无法编译,并出现以下错误:
no suitable method found for equals(T,T)
我该如何解决这个问题?
答案 0 :(得分:2)
如果您查看java.util.Arrays.deepEquals0(Object, Object)
您可以看到以下代码
static boolean deepEquals0(Object e1, Object e2) {
assert e1 != null;
boolean eq;
if (e1 instanceof Object[] && e2 instanceof Object[])
eq = deepEquals ((Object[]) e1, (Object[]) e2);
else if (e1 instanceof byte[] && e2 instanceof byte[])
eq = equals((byte[]) e1, (byte[]) e2);
else if (e1 instanceof short[] && e2 instanceof short[])
eq = equals((short[]) e1, (short[]) e2);
else if (e1 instanceof int[] && e2 instanceof int[])
eq = equals((int[]) e1, (int[]) e2);
else if (e1 instanceof long[] && e2 instanceof long[])
eq = equals((long[]) e1, (long[]) e2);
else if (e1 instanceof char[] && e2 instanceof char[])
eq = equals((char[]) e1, (char[]) e2);
else if (e1 instanceof float[] && e2 instanceof float[])
eq = equals((float[]) e1, (float[]) e2);
else if (e1 instanceof double[] && e2 instanceof double[])
eq = equals((double[]) e1, (double[]) e2);
else if (e1 instanceof boolean[] && e2 instanceof boolean[])
eq = equals((boolean[]) e1, (boolean[]) e2);
else
eq = e1.equals(e2);
return eq;
}
所以我认为你需要做类似的事情。
答案 1 :(得分:0)
你需要做一些演员 - 如下所示。你可能需要有一些逻辑来有条件地将它们转换为int [],float [],Object []等。
private static <T> boolean equal (T a, T b)
{
if (a == null)
if (b == null)
return true;
else
if (b.getClass().isArray())
return Arrays.equals((Object[])b, (Object[])a);
else
return b.equals(a);
else
if (a.getClass().isArray())
return Arrays.equals(a, b);
else
return a.equals(b);
}
答案 2 :(得分:0)
Arrays.equals
不接受任何通用类型<T>
。
它只接受不同类型的数组[]
。请参阅API
因此,您必须先将a
和b
投射到数组中,然后再将其传递给Arrays.equals
,如下所示:
Object[] bArr = (Object[])b;
Object[] aArr = (Object[])a;
return Arrays.equals(bArr, aArr);