我的函数之一获取类型变量。有时可以java.util.List<Test$MyClass>,java.util.List<java.lang.String>那么我如何识别它们?
if (type instanceof List) {
}
Run Code Online (Sandbox Code Playgroud)
两者都是List类型,但类型不同。所以上面的代码不起作用。我想区分这两种列表类型。
我的主要问题是/sf/ask/1091727871/
我正在用deserializer这个..
public class Data implements JsonDeserializer<ArrayList<MyClass1>> {
public ArrayList<MyClass1> myList1 = new ArrayList<MyClass1>();
public ArrayList<MyClass2> myList2 = new ArrayList<MyClass2>();
@Override
public ArrayList<MyClass1> deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
Debug.e("", type.toString());
ArrayList<Layoutmap> data = new ArrayList<Layoutmap>();
try {
if (json.isJsonObject()) {
// my stuff
return data;
} else {
return new Gson().fromJson(json, type);
}
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
Run Code Online (Sandbox Code Playgroud)
}
上面的代码适用于public ArrayList<MyClass2> myList2 = new ArrayList<MyClass2>();并且myList2我也想反序列化..它是 google Gson的一部分。
是的,问题是在 Java 中,针对不可具体化的类型进行实例测试始终是一个错误。
例如:
if(o instance of List<E>)
Run Code Online (Sandbox Code Playgroud)
其中 E 是任何类型,将无法编译。
您只需检查列表中包含的内容是否是同一类型,例如
if(list1.get(0) instance of String && list2.get(0) instance of String)
Run Code Online (Sandbox Code Playgroud)
编辑:
不确定这里是否存在语言障碍问题(您的问题很难完全理解),但您不需要让您的方法采用 Type 类型的参数。正如其他人提到的,你的设计很糟糕。您应该做的只是定义如何反序列化每个类(如果需要定义自定义反序列化;也就是说,如果默认值不起作用),然后使用 Gson 以常规方式获取这些类的列表。
我对 Gson 不是很熟悉,但它应该是这样的:
List<Class1> stuff = gson.fromJson(json, new TypeToken<List<Class1>>(){}.getType());
Run Code Online (Sandbox Code Playgroud)
因此,换句话说,如果每个类都有使默认反序列化不起作用的特性,那么就没有办法(无需大量练习)使方法deserialize适用于每种类型。
另外,不要将所有功能合并为一个。获取 anArrayList<LayoutMap>应该与反序列化每个类的功能分开。