【问题标题】:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to X error when call to X error when call Gson fromJson for generic typejava.lang.ClassCastException:java.util.LinkedHashMap 无法在调用 Gson fromJson 为泛型类型时调用 X 错误时转换为 X 错误
【发布时间】:2022-01-29 19:10:35
【问题描述】:

您好,我在 Kotlin Android 中有此代码 我尝试将JSON字符串解析为数据类,但数据未知,我的意思是数据类是通用类型T

class JsonFeatureFlag<T>(
        key: String,
        @StringRes nameResId: Int,
        category: DevOptionCategory,
        val defaultValue: T
    ): FeatureFlagV2<T>(key, nameResId, category) {
    .....
    override fun getValue(): T {
            val json = FirebaseRemoteConfig.getInstance().getString(key)
            return try {
                Gson().fromJson(json, object: TypeToken<T>(){}.type)
            } catch (e: Exception) {
                reportInvalidJson(json)
                defaultValue
            }
        }
    ....
    }


我收到了这个错误: java.lang.ClassCastException:java.util.LinkedHashMap 无法转换为 X

虽然我知道 TypeToken 应该用于泛型,但有些东西不起作用。

【问题讨论】:

  • 由于在运行时进行类型擦除,T 只是 java.lang.Object(我假设分别是 Kotlin 的 Any)。 Gson 默认反序列化ObjectMap。如果您可以更改您的JsonFeatureFlag 类以包含T 的运行时类,那么您可以直接将该类传递给Gson.fromJson 调用。
  • 这能回答你的问题吗? Gson, ClassCastException with Generics
  • 感谢@Marcono1234,我还阅读了有关类型擦除的信息。我已将其更改为 Gson().fromJson(json, className) 并将 className: Class 传递给方法
  • 如果这解决了您的问题,您介意在这个 StackOverflow 问题中添加您自己的答案以表明它已得到回答吗?
  • 嗨@Marcono1234 我播下了这个答案stackoverflow.com/questions/25431859/…,但它没有回答我的问题。我没有清单或清单。我的 T 泛型可以是任何类

标签: java android kotlin generics gson


【解决方案1】:

为了解决这个问题,我提供了一个类名 即类名:类 虽然我使用了 genric,但当有人想使用我的 API 并调用 getValue 时,类型是已知的,他可以将类名提供给 get value 方法。

class JsonFeatureFlag<T>(
    key: String,
    @StringRes nameResId: Int,
    category: DevOptionCategory,
    val defaultValue: T
): FeatureFlagV2<T>(key, nameResId, category) {


     fun getValue(className: Class<T>): T {
        val json = FirebaseRemoteConfig.getInstance().getString(key)
        return try {
            Gson().fromJson(json, className)
        } catch (e: Exception) {
            reportInvalidJson(json)
            defaultValue
        }
    }

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多