gpt4 book ai didi

java - 为什么我不能按照我需要的方式使用 TypeToken?

转载 作者:行者123 更新时间:2023-12-01 16:44:00 25 4
gpt4 key购买 nike

我正在尝试解决反序列化 HashMap<Integer, MyParcelablePojo> 时遇到的问题。为了寻找答案,我发现了以下问题:

如果我尝试:

HashMap<Integer, MyParcelablePojo> mHashMap = new Gson().fromJson(the_json_string, HashMap.class);

...结果HashMap包含LinkedTreeMap对象而不是 MyParcelablePojo对象。

因此,我尝试使用 TypeToken以与我在上面链接的第二个问题中看到的类似的方式,但它不允许我指定 HashMap 的参数。如果我尝试:

// XXX I am not sure if this "Type" is the correct one
// there were several "Type" classes to choose from
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;

Type collection_type = new TypeToken<HashMap<Integer, MyParcelablePojo>>();

...Android Studio 向我显示此错误:

'TypeToken()' has protected access in 'com.google.gson.reflect.TypeToken'

...只是为了坚持我看到的示例,我尝试使用 new TypeToken<HashMap<T>>看看错误是否消失(只是出于好奇,我对使用通用 T 根本不感兴趣),然后它说“无法解析 T”,这太奇怪了......但这与我的问题,我只是为了完整性而添加它......

...回到正题,所以TypeToken的构造函数是 protected ,对吧?所以,延长类(class)可能会有所帮助,对吧?但如果我看到构造函数,我就会觉得很奇怪,无法理解。参数化类型以这种方式使用非常奇怪(至少就我目前对它们的理解而言)。该部分<? super T>有点令人困惑(看起来它正在调用 T 的父类型,但我只是不完全明白)。但是,对我来说更奇怪的是 $Gson$Types.getRawType(type) ...我想知道那些是什么$用于...:

protected TypeToken() {
this.type = getSuperclassTypeParameter(getClass());
this.rawType = (Class<? super T>) $Gson$Types.getRawType(type);
this.hashCode = type.hashCode();
}

开门见山

我只是想避免这种情况 Gson.fromJson方法返回 LinkedTreeMap作为值,而不是 MyParcelablePojo 。链接问题中提供的答案对我来说似乎太通用了,所以我不明白如何将它们应用到我的案例中(请注意,我现在对通用性不感兴趣)。我什至怀疑它们是否适用于我的情况。

我使用 HashMap 的主要动机是因为我想使用 ID 基础自己定义索引。我应该怎么做才能正确解决从 JSON 字符串反序列化的问题?

最佳答案

您可以通过创建子类来实例化 TypeToken,该子类通常是匿名的:

Type collection_type = new TypeToken<HashMap<Integer, MyParcelablePojo>>(){}.getType();

请注意我答案中的 {}。 JavaDoc 中解释了其原因:

/**
* Represents a generic type {@code T}. Java doesn't yet provide a way to
* represent generic types, so this class does. Forces clients to create a
* subclass of this class which enables retrieval the type information even at
* runtime.
*
* <p>For example, to create a type literal for {@code List<String>}, you can
* create an empty anonymous inner class:
*
* <p>
* {@code TypeToken<List<String>> list = new TypeToken<List<String>>() {};}
*
* <p>This syntax cannot be used to create type literals that have wildcard
* parameters, such as {@code Class<?>} or {@code List<? extends CharSequence>}.
*
* @author Bob Lee
* @author Sven Mawson
* @author Jesse Wilson
*/

关于java - 为什么我不能按照我需要的方式使用 TypeToken?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56490175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com