У меня есть ScheduledSessionViewModel
класс, который расширяет AbstractSessionViewModel
. Обе эти функции имеют реализацию функции equals () .
class AbstractSessionViewModel {
@Override public boolean equals(Object o) {
return /* some logic */
}
}
class ScheduledSessionViewModel extends AbstractSessionViewModel {
@Override public boolean equals(Object o) {
if (!super.equals(o)) return false;
return /* some logic */;
}
}
Так как я использую новые Android ListAdapter
, я реализую DiffUtil.ItemCallback<T>
, и у меня есть следующий метод:
@Override public boolean areContentsTheSame(AbstractSessionViewModel oldItem, AbstractSessionViewModel newItem) {
if (oldItem instanceof ScheduledSessionViewModel && !(newItem instanceof ScheduledSessionViewModel)){
return false;
} else if (!(oldItem instanceof ScheduledSessionViewModel) && newItem instanceof ScheduledSessionViewModel){
return false;
} else if (oldItem instanceof ScheduledSessionViewModel){
return ((ScheduledSessionViewModel)oldItem).equals((ScheduledSessionViewModel)newItem);
} else {
return oldItem.equals(newItem);
}
}
Что странно, это то, что компилятор показывает мне предупреждение, что в следующем выражении
((ScheduledSessionViewModel) oldItem) .equals ((ScheduledSessionViewModel) newItem);
тип приведения не требуется .
Как это возможно? Как Java-компилятор может обнаружить, что oldItem
имеет тип ScheduledSessionViewModel
?