Почему 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;
}
}