排序数组列表<Object>导致类转换异常



我的ViewModel观察者返回一个ArrayList<ContactObject>(contactsList),我想在使用修改的ArrayList<ContactObject>设置RecyclerView之前过滤和排序。

过滤器按预期工作(它返回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

所以我试图理解为什么这些函数返回不同类型的列表比.filter或者如果我只是使用它们不正确?

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

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

然而,我必须在我的ViewModel中创建额外的变量,这是我希望避免的(即我要将contactsList.sortedWith(compareBy { it.contactName })直接传递给recyclerView)

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

这两个类都扩展了AbstractList类,后者又实现了List接口。我认为正因为如此,你看到的类型是List,但具体的实现是不同的。一个是java.util。数组$ArrayList,另一个是java.util.ArrayList .

最新更新