如何在Android中获取ArrayList的Model Data类型?

时间:2017-08-17 19:11:10

标签: java android arrays arraylist

以下onFilter()方法给了我一个数组列表,但我有不同的arraylist与不同的模型, 例如:ArrayList,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模型类型?我们可以检查整个arraylist模型类型而不获取它的对象吗?

2 个答案:

答案 0 :(得分:1)

  

如果数组为空,我如何检查arraylist模型类型?

简单地说,您不能在ArrayList中没有任何额外的类型信息。它只是Object s。

  

我们可以在不获取其对象的情况下检查整个arraylist模型类型吗?

ArrayList仅包含Object类型的元素。因此,检查第一个元素并不能保证整个数组都属于那种类型。虽然有一个编译时检查(ArrayList<>),但在运行时你必须迭代所有元素并检查instanceof以确保它们属于你的类型想。

答案 1 :(得分: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