排序 ArrayList<Object> 导致 ClassCastException

问题描述

我的 <dependency> <groupId>net.postgis</groupId> <artifactId>postgis-jdbc</artifactId> <version>${driver.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/net.postgis/postgis-geometry --> <dependency> <groupId>net.postgis</groupId> <artifactId>postgis-geometry</artifactId> <version>${driver.version}</version> </dependency> 观察者返回一个 viewmodel (ArrayList<ContactObject>),我想在使用修改后的 contactsList 设置 RecyclerView 之前对其进行过滤和排序。

过滤器按预期工作(它返回 ArrayList<ContactObject>,我可以将其转换为 List<ContactObject>):

ArrayList<ContactObject>

但我无法使用任何排序功能 - 我已经尝试过:

var filteredContactsList = contactsList.filter { contact -> !contact.sites.contains(siteId) } as ArrayList<ContactObject>

var sortedList = contactsList.sortBy {(it as ContactObject).contactName} as ArrayList<ContactObject>

但我得到以下异常:

var sortedList = contactsList.sortedWith(compareBy { it.contactName }) as ArrayList<ContactObject>

所以我想了解为什么这些函数返回的列表类型与 java.lang.classCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList 不同,或者我是否只是错误地使用了它们?

编辑:我可以通过将其转换为 ArrayList 来解决这个问题,如下所示:

.filter

但是,我必须在我的 viewmodel 中创建额外的变量,我希望避免这种情况(即我打算将 var sortedList = ArrayList<ContactObject>() sortedList.addAll(contactsList.sortedWith(compareBy { it.contactName })) 直接传递给 contactsList.sortedWith(compareBy { it.contactName })

解决方法

如果你打印返回类型的类名,你会知道 sortedWith 返回的对象的类是 java.util.Arrays$ArrayList 类型,而过滤器返回的对象是 java.util.ArrayList .因此,即使类名看起来相同,但是当您转换过滤器的输出时它是成功的(它是 ArrayList 类型)但另一个失败(java.util.Arrays$ArrayList 具有相同的名称但嵌套在 Arrays 中类)。

这两个类都扩展了 AbstractList 类,后者又实现了 List 接口。我认为因此您将类型视为 List 但具体实现不同。一个是 java.util.Arrays$ArrayList 而另一个是 java.util.ArrayList 。