如何在安卓系统中检查类型

4

我的一个函数会获取Type变量。有时它可以是java.util.List<Test$MyClass>java.util.List<java.lang.String>,那么我该如何识别它们?

if (type instanceof List) {

}

两者都是列表类型,但类型不同。因此上面的代码无法工作。 我想区分这两种列表类型。

我的主要问题是https://stackoverflow.com/questions/15596112/implement-jsondeserializer-more-than-one-in-gson-in-android

我正在使用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;
}

}

上面的代码适用于 public ArrayList<MyClass2> myList2 = new ArrayList<MyClass2>();,而且我也想反序列化 myList2。这是 Google Gson 的一部分。

你想区分这两种列表类型吗? - tom
2
在我看来,这表明存在设计问题。你不应该有一个方法有时返回某个东西,有时返回另外一些东西。 - JB Nizet
同意JB Nizet的观点。但是如果出于某种原因想要比较每个元素,那么可以查看我的答案。 - lokoko
类型不是列表类型..请查看我的更新问题... - Bhavesh Hirpara
这篇文章的第一个答案可能对你有帮助。简而言之:使用反射。 - Oren
5个回答

5

是的,在Java中,对于不可重构类型的实例测试始终是错误的。

举个例子:

if(o instance of List<E>)

当E为任何类型时,代码将无法编译。

您只需要检查列表中包含的内容是否为相同的类型,例如:

if(list1.get(0) instance of String && list2.get(0) instance of String)

编辑:

不确定是否存在语言障碍问题(您的问题很难完全理解),但您不需要使您的方法接受Type类型的参数。正如其他人提到的,您在这里有一个糟糕的设计。您应该简单地定义如何反序列化每个类(如果需要定义自定义反序列化,那么就是默认值无法工作),然后用Gson以常规方式获取这些类的列表。

我对Gson不是非常熟悉,但应该是这样的:

List<Class1> stuff = gson.fromJson(json, new TypeToken<List<Class1>>(){}.getType());

换句话说,如果每个类都有特殊的特点,使默认反序列化无法正常工作,则没有办法(除非进行很多变通)使 deserialize 方法适用于每种类型。

此外,不要将所有功能合并为一个。获取 ArrayList<LayoutMap> 应该与反序列化每个类的功能分开。


请参阅更新的问题...我在执行前没有列表。 - Bhavesh Hirpara

2

尝试在运行时使用getClass()函数来查找对象的类。例如,type.getClass().equals(java.lang.string)。


1
你可以尝试这样做:

你只需要尝试像这样:

for (int i=0; i<type.size(); ++i) {
    if (type.get(i) instanceof String) {
        // Do something here
    }
}

这将检查列表中的每个元素,如果是字符串,则可以对其进行操作。

使用您的解决方案时,当列表为空时无法识别类型。 - Pragnani

0

0

我刚找到了解决方案...不知道它是否更好

我正在比较两个Type变量,就像这样...

if (type.toString().equalsIgnoreCase(
                new TypeToken<List<Test.MyClass>>() {
                }.getType().toString())) {

}else
{

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接