Почему DiffUtil не генерирует исключение ClassCastException при использовании класса Kotlin Sealed - PullRequest
0 голосов
/ 28 мая 2020

Я использую запечатанный класс с адаптером списка Android, в котором 2 разных объекта объединены в один список. Последний элемент в списке - это просто дополнительный макет (как заголовок). Я использую DiffUtils и заметил, что даже я привел newItem к Object1, он не генерирует исключение приведения класса. Например: 1-й есть 7 элементов (6 Object1 + 1 Add More) в currentList адаптера, затем я удалил 1 объект, пусть это будет объект с индексом 6. Теперь, когда diffUtil проверяет areItemsSame (), он не генерирует исключение . По моему мнению, oldItem в 6 будет Object1, поскольку этот элемент удален, что означает, что теперь элемент с индексом 6 - Add More, и теперь приведение его к Object1 должно вызывать исключение ClassCastException

Мой код утилиты diff

override fun areContentsTheSame(oldItem: DataItem, newItem: DataItem): Boolean {
            if (oldItem is DataItem.ItemToDoCat)
            Log.v("Recycler","Old :${(oldItem).toDoCategory.category} ,New ${(newItem as DataItem.ItemToDoCat).toDoCategory.category}")
            return when (oldItem) {

            //Since i am only checking for oldItem, casting newItem should throw an Exception as per my example
                is DataItem.ItemToDoCat -> (oldItem).toDoCategory == (newItem as DataItem.ItemToDoCat).toDoCategory
                is DataItem.ItemAddPlaceHolder -> oldItem == newItem
            }
        }

Вот журнал перед добавлением теста

2020-05-28 17:14:42.226 32588-1009/com.example.todomaster V/Recycler: Old :Default ,New Default
2020-05-28 17:14:42.226 32588-1009/com.example.todomaster V/Recycler: Old :Personal ,New Personal
2020-05-28 17:14:42.226 32588-1009/com.example.todomaster V/Recycler: Old :Work ,New Work

Журнал после добавления теста

2020-05-28 17:44:58.643 10717-10779/com.example.todomaster V/Recycler: Old :Default ,New Default
2020-05-28 17:44:58.644 10717-10779/com.example.todomaster V/Recycler: Old :Personal ,New Personal
2020-05-28 17:44:58.644 10717-10779/com.example.todomaster V/Recycler: Old :Work ,New Work

Журнал после удаления теста

2020-05-28 17:51:33.116 10717-11005/com.example.todomaster V/Recycler: Old :Default ,New Default
2020-05-28 17:51:33.116 10717-11005/com.example.todomaster V/Recycler: Old :Personal ,New Personal
2020-05-28 17:51:33.116 10717-11005/com.example.todomaster V/Recycler: Old :Work ,New Work

Как можно см. Журнал даже не регистрирует тестовый объект oldList после удаления, что означает, что oldList не имеет экземпляра с тестовым объектом

...