2017-08-17 152 views
0

继onFilter()方法给了我一个数组列表,但我有不同的arraylist与不同的模型, 例如:ArrayList,ArrayList等。如何在Android中获取ArrayList的模型数据类型?

@Override 
public void onFilter(ArrayList items) { 
    if (items != null && items.size() > 0) { 
     if (items.get(0) instanceof ChatModel) { 
      // Do something 
     } else if (items.get(0) instanceof ContactDetailModel) { 
      // Do something 
     } 
    } 

在这里,我可以很容易地检查数组对象的类型,但我怎么能检查的ArrayList模型的类型,如果数组是空的?我们是否可以检查整个阵列列表模型类型而无需获取其对象?

回答

1

如何检查数组为空的数组列表模型类型?

简而言之,您不能在ArrayList中找到任何额外的类型信息。它只是Object s。

我们可以检查整个阵列列表模型类型而无需获取其对象吗?

ArrayList只包含Object类型的元素。所以检查第一个元素并不能保证整个数组都是这种类型的。虽然有一个编译时间检查(ArrayList <>),但在运行时,您必须迭代所有元素并检查instanceof以确保它们是您想要的类型。

1

您可以使用Java Reflection来实现此目的。

有一个例子:

public class Test { 

    List<String> stringList = new ArrayList<String>(); 
    List<Integer> integerList = new ArrayList<Integer>(); 

    public static void main(String... args) throws Exception { 
     Field stringListField = Test.class.getDeclaredField("stringList"); 
     ParameterizedType stringListType = (ParameterizedType) stringListField.getGenericType(); 
     Class<?> stringListClass = (Class<?>) stringListType.getActualTypeArguments()[0]; 
     System.out.println(stringListClass); // class java.lang.String. 

     Field integerListField = Test.class.getDeclaredField("integerList"); 
     ParameterizedType integerListType = (ParameterizedType) integerListField.getGenericType(); 
     Class<?> integerListClass = (Class<?>) integerListType.getActualTypeArguments()[0]; 
     System.out.println(integerListClass); // class java.lang.Integer. 
    } 
} 

在你的情况下,您将需要获得一个函数参数的类型。在这种情况下Reflection可以是用户通过同样的方式,在您的参数,使用:

public void onFilter(ArrayList items) { 

    // using 
    items.getClass().getGenericSuperclass(); 

    // or 
    ((ParameterizedType) items 
     .getClass() 
     .getGenericSuperclass()).getActualTypeArguments()[0]); 
} 

通过这种方式,您ArrayList不需要有任何项目。

没有这一点,不可能在运行时得到相对泛型类型,因为泛型编译时的数据类型擦除。

Link to related awnser

+0

不明白为什么。您能否请您发表评论@OrkhanAlikhanov? – GuilhermeFGL

+0

你并不完全正确。我最初的解决方案是'Heap'列表中的变量示例。但是您可以使用非常类似的方式在'Stack'列表中的变量中使用反射。我用该解决方案更新我的答案 – GuilhermeFGL

+0

你可以让它工作,我不能。 https://repl.it/KO5D/3 –

相关问题