【问题标题】:ArrayList cannot be cast to java.lang.Object[]ArrayList 不能转换为 java.lang.Object[]
【发布时间】:2020-07-11 18:37:04
【问题描述】:

我使用了question 中的一个答案来获得有关先前错误的帮助,但现在我又得到了另一个答案。这个问题有一个建议answer,但我无法解决我的问题。

java.lang.ClassCastException: java.util.ArrayList 无法转换为 java.lang.Object[]

private var data: Any? // fixed, can't change data type as it's in a compiled library to accept all kinds of data.

fun users() : ArrayList<User> {
    return (data as Array<*>).filterIsInstance<User>() as ArrayList<User>
}

在评论中的建议之后,工作代码看起来像这样,但我有另一个副作用,我无法将项目添加到数组中,ArrayList 保持为空。

fun users() : ArrayList<User> {
    return (data as ArrayList<*>).filterIsInstance<User>() as ArrayList<User>
}

fun addItem(userVO: User) {
    users().add(user)
}

编辑 2

val users: ArrayList<User> get() = ((data as? ArrayList<Any>)?.filterIsInstance<User>() ?: emptyList()) as ArrayList<User>

fun addItem(user: User) {
    users.add(user)
}

【问题讨论】:

  • 什么是data
  • 它是var data: Any?,加入我的问题
  • 如果您将ArrayList 存储在data 中,为什么要转换为Array
  • 你的意思是应该是return (data as ArrayList&lt;*&gt;).filterIsInstance&lt;User&gt;() as ArrayList&lt;User&gt;
  • 因为filterIsInstance 返回一个新的ArrayList,您可以在其中添加user

标签: kotlin


【解决方案1】:

使用无类型的data 作为源不是最好的主意,但如果您使用第三方库,您可能别无选择。在这种情况下,您可以尝试以下方法:

private var data: Any? = null

@Suppress("UNCHECKED_CAST")
val users: List<User> get() = (data as? ArrayList<Any>)?.filterIsInstance<User>() ?: emptyList()

fun addUser(user: User) {
   @Suppress("UNCHECKED_CAST")
   (data as? ArrayList<Any>)?.add(user)
}

在上面,我假设data 列表可能不仅包含用户,还包含其他实体。

【讨论】:

  • 对不起,由于 filterIsInstance,我仍然有空列表的问题
  • @AppDeveloper 如果您使用我的示例中的addUser 函数,那么filterIsInstance 不会是问题。您能否描述一下导致“由于 filterIsInstance 导致空列表”问题的行为?
  • 能否请您更新代码以在val users: List&lt;User&gt; 中使用ArrayList,因为我也删除了正在使用的方法
  • 请参阅我的编辑 2 以获取更新的代码。 Intellij 为我铸造了它。我的添加项目调用了 getter(不像你的例子),这就是为什么它最终得到 0 个项目。
  • 好吧,您不能将某些内容添加到过滤列表中并期望原始列表中的新值。只需看一下filterIsInstance 的实现,您就会看到在那里创建了一个新的ArrayList。我特意为users 属性指定了不可变的List&lt;User&gt; 类型以限制任何直接添加。
猜你喜欢
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多