java - 使用 gson 反序列化时将 TypeToken 转换为 Type 时出错

标签 java eclipse generics casting gson

我有一个类使用此函数反序列化泛型的 ArrayList,正如该线程的第一个答案中所述:Java abstract class function generic Type

public <T> ArrayList<T> arrayType(String data){
    return g.fromJson(data,   TypeToken.get(new ArrayList<T>().getClass()));
}

Eclipse 要求我强制转换 TypeToken 结果(因为来自 Json 的函数需要类型,而不是 TypeToken)

public <T> ArrayList<T> arrayType(String data){
    return g.fromJson(data,  (Type) TypeToken.get(new ArrayList<T>().getClass()));
}

结果我得到这个错误:

java.lang.ClassCastException: com.google.gson.reflect.TypeToken cannot be cast to java.lang.reflect.Type

gson user manual他们告诉你这是调用函数的正确方法

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
Collection<Integer> ints2 = gson.fromJson(json, collectionType);

而且我看不出我做错了什么(如果这是一个有效的答案,为什么我会收到这个转换错误?)

最佳答案

好吧,你调用TypeToken.get ,它返回一个 TypeToken - 不是 Type .在您展示的示例中,它使用的是 TypeToken.getType() ,它返回一个 Type .

所以你可以使用:

return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass()).getType());

... 这会返回一个 Type ,但它可能不是您真正想要的。特别是,由于类型删除,无论什么类型都会返回相同的类型 T您从调用站点指定。如果您希望类型真正反射(reflect)ArrayList<T> ,您需要将类传递到方法中,尽管我不完全确定从那里去哪里。 (根据我的经验,Java 反射 API 在涉及泛型时并不是很清楚。)

顺便说一句,我希望有一个名为 arrayType 的方法与数组有关,而不是ArrayList .

关于java - 使用 gson 反序列化时将 TypeToken 转换为 Type 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486764/

相关文章:

java - "Source not found"消息在 Eclipse 中与 JBoss 在 Debug模式下 - 断点在我的代码中

c# - 如何在 C# 中的这种奇怪情况下创建通用列表

java - Java 中泛型类型的树实现

java - 如何在返回 HTTP 代码后通知客户端异常

java - 功能被破坏,尽管它看起来是正确的

java - 如何向数组添加元素?

java - 无法打开数据库/无法将(数据库)的区域设置更改为 'en_US'

通用扩展方法的 C# 特化

java - 使用 Smack API 和 talk.goolgle.com 服务器进行 Android 聊天

java - 无法构建 Netbeans 项目