Почему SparseIntArray.equals(Object) не работает?

Я использую SparseIntArray и я озадачен этим поведением:

public static SparseIntArray getArray()
{
    SparseIntArray result = new SparseIntArray();
    result.append(0, 99);
    result.append(1, 988);
    result.append(2, 636);

    return result;
}

public static void testArray()
{
    SparseIntArray first = getArray();
    SparseIntArray second = getArray();
    if( first.equals(second) )
    {
        Log.v(TAG,"first "+first.toString()+" == second "+second.toString());           
    }
    else
    {
        Log.v(TAG,"first "+first.toString()+" != second "+second.toString());
    }
}

Выход:

11-06 14:53:15.011: V/fileName(6709): first {0=99, 1=988, 2=636} != second {0=99, 1=988, 2=636}

Я знаю, что использование == между двумя объектами будет сравнивать адреса объектов, которые в этом случае разные, но здесь я использую SparseIntArray.equals(Object other) и ожидаемый результат не является неожиданным.

Я уверен, что могу использовать свой собственный метод сравнения, но это звучит глупо. Какой смысл иметь базовый класс Object.equals(Object other) метод, если мы не можем положиться на это?

Кто-то может указать на какую-либо ошибку?

2 ответа

Решение

Я просто искал код SparseIntArray, Если вы ссылаетесь на android.util.SparseIntArray, он не переопределяет equalsЭто означает, что он использует реализацию по умолчанию Object класс, который сравнивает ссылки.

Какой смысл иметь метод базового класса Object.equals(Object other), если мы не можем на него положиться?

На самом деле, вы не можете полагаться на базовый класс Object.equals, поскольку он делает именно то, что вы не хотите делать:

public boolean equals(Object obj) 
{
    return (this == obj);
}

Авторы любого класса должны решить, следует ли переопределить equals и дать другую реализацию.

@Eran прав, Object.equals(Object) не обрезает его.

Я сделал простой статический метод для сравнения двух экземпляров

public static boolean compareSame( SparseIntArray first, SparseIntArray second )
{
    // compare null
    if( first == null )
    {
        return (second == null);
    }
    if( second == null )
    {
        return false;
    }

    // compare count
    int count = first.size();
    if( second.size() != count )
    {
        return false;
    }

    // for each pair
    for( int index = 0; index < count; ++index )
    {
        // compare key
        int key = first.keyAt(index);
        if( key != second.keyAt(index))
        {
            return false;
        }

        // compare value
        int value = first.valueAt(index);
        if( second.valueAt(index) != value)
        {
            return false;
        }
    }       

    return true;
}

Я, вероятно, в конечном итоге получу свою собственную версию SparseIntArray и переопределю метод equals, я думаю, что это более чисто.

[EDIT] Вот код для подкласса, реализующего равно

import android.util.SparseIntArray;

public class SparseIntArrayComparable extends SparseIntArray {
@Override
public boolean equals( Object obj ) {

    if( obj instanceof SparseIntArray ) {
        SparseIntArray other = (SparseIntArray)obj;

        // compare count
        int count = size();
        if( count != other.size() )
            return false;

        // for each pair
        for( int index = 0; index < count; ++index ) {

            if( keyAt(index) != other.keyAt(index))
                return false;

            if( valueAt(index) != other.valueAt(index) )
                return false;
        }       

        return true;
    }
    else
        return false;
    }
}
Другие вопросы по тегам