问题描述
我的 <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 。