如何检查android中的类型

Bha*_*ara 4 java android gson

我的函数之一获取类型变量。有时可以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的一部分。

Lux*_*ode 5

是的,问题是在 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>应该与反序列化每个类的功能分开。