簡體   English   中英

通用平等測試

[英]Generic equality test

我想檢查兩個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)

我怎樣才能解決這個問題?

如果您查看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;
}

所以我認為您將需要做類似的事情。

您將需要進行一些投射-如下所示。 您可能需要一些邏輯,才能有條件地將它們強制轉換為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);
}

Arrays.equals不接受任何通用類型<T>

它僅接受不同類型的數組[] API

因此,在將其傳遞給Arrays.equals之前,您必須將abArrays.equals轉換為數組:

Object[] bArr = (Object[])b;
Object[] aArr = (Object[])a;
return Arrays.equals(bArr, aArr);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM