Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我不能按我需要的方式使用TypeToken?_Java_Android_Oop_Generics_Gson - Fatal编程技术网

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

Java 为什么我不能按我需要的方式使用TypeToken?,java,android,oop,generics,gson,Java,Android,Oop,Generics,Gson,我试图解决反序列化哈希映射时遇到的一个问题。为了找到答案,我发现了以下问题: 如果我尝试: HashMap<Integer, MyParcelablePojo> mHashMap = new Gson().fromJson(the_json_string, HashMap.class); …Android Studio向我显示此错误: “TypeToken”在“com.google.gson.reflect.TypeToken”中具有受保护的访问权限 …只是为了坚持我看到的示例,我

我试图解决反序列化哈希映射时遇到的一个问题。为了找到答案,我发现了以下问题:

如果我尝试:

HashMap<Integer, MyParcelablePojo> mHashMap = new Gson().fromJson(the_json_string, HashMap.class);
…Android Studio向我显示此错误:

“TypeToken”在“com.google.gson.reflect.TypeToken”中具有受保护的访问权限

…只是为了坚持我看到的示例,我尝试使用new TypeToken来查看错误是否出于好奇而消失,我根本不想使用泛型T来解决这个问题,然后它说无法解析T,这太奇怪了。。。但这与我的问题无关,我只是为了完整性添加了它

…回到正题,TypeToken的构造函数是受保护的,对吗?所以,扩展类可能会有所帮助,对吗?但是如果我看到构造器,我就很难理解它。参数化类型以这种方式使用是非常奇怪的,至少就我目前对它们的理解而言。通过创建子类实例化TypeToken,子类通常是匿名的:

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

我认为你没有正确使用TypeToken,我一直在做

HashMap<Integer, GenericObject> mHashMap = new Gson().fromJson(json, new TypeToken<HashMap<Integer, GenericObject>>(){}.getType());

其中传递的是类型,而不是实际的令牌

如果您正在使用kotlin,请不要忘记使用对象:


…哎呀,我忘了应用我在链接的问题中看到的示例中的{}.getType部分。。。我可以补充一点,我没有料到{}足以让错误出现。谢谢…我现在已经测试过了。现在它正确地反序列化了。非常感谢,你说得对。公认的答案指向了同样的事情。谢谢
Type collection_type = new TypeToken<HashMap<Integer, MyParcelablePojo>>(){}.getType();
/**
 * 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
 */
HashMap<Integer, GenericObject> mHashMap = new Gson().fromJson(json, new TypeToken<HashMap<Integer, GenericObject>>(){}.getType());
val type: Type = object : TypeToken<ArrayList<YourArrayType>>() {}.type