2013-03-24 52 views
1

我的一个功能变得Type变量。有时它可能是java.util.List<Test$MyClass>java.util.List<java.lang.String>,那么我如何识别它们?如何查询android

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也是我想反序列化.. 它一部分的谷歌Gson

+0

你想在两者之间进行区分列表类型? – tom 2013-03-24 11:54:56

+2

恕我直言,这表明一个设计问题。你不应该有一种方法有时返回某些东西,而有些时候则有其他东西。 – 2013-03-24 12:01:19

+0

同意JB Nizet。但如果你想比较每个元素出于某种原因,那么你可以检查我的答案。 – lokoko 2013-03-24 12:04:27

回答

0

我只是觉得我的解决方案。我不知道这是好还是不

我比较两个Type变量是这样的...

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

}else 
{ 

} 
1

是的,问题是在Java中,针对不可确定类型的实例测试始终是错误。

例如:

if(o instance of List<E>) 

其中E是任意类型的,将不编译。

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

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

编辑:

不知道这里有语言障碍的问题(你的问题很难完全理解),但你不应该需要让你的方法采取类型类型的参数。正如别人提到的,你在这里设计不好。你应该做的是简单地定义如何反序列化你的每个类(如果需要定义自定义反序列化......就是说,如果默认值不起作用),然后以常规方式获得这些列表GSON。

我不是超级熟悉GSON,但它应该是这样的:

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

所以,换句话说,如果每个班有特点,这将使默认的反序列化不行,那么有没有办法(没有疯狂的体操)为每种类型制定反序列化方法。另外,不要将所有功能合并为一个。获取ArrayList<LayoutMap>应与反序列化每个类的功能分开。

+0

请查看更新后的问题...并且我没有列出发病前的列表 – 2013-03-24 12:10:52

0

你可以只尝试类似:

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

这将检查列表中的每个元素,如果它的一个字符串,你可以在它的工作。

+0

当您的解决方案列表为空时,无法识别类型 – Pragnani 2013-03-24 12:12:12

0

尝试在您的类型上使用getClass()函数以在运行时查找对象的类。 例如.. type.getClass()。equals(java.lang。字符串)