Java 如何在Android中获取ArrayList的模型数据类型?

Java 如何在Android中获取ArrayList的模型数据类型?,java,android,arrays,arraylist,Java,Android,Arrays,Arraylist,下面的onFilter()方法为我提供了一个数组列表,但我有不同的arraylist和不同的模型, e、 g:ArrayList,ArrayList等 @Override public void onFilter(ArrayList items) { if (items != null && items.size() > 0) { if (items.get(0) instanceof ChatModel) { // Do

下面的onFilter()方法为我提供了一个数组列表,但我有不同的arraylist和不同的模型, e、 g: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模型类型而不获取其对象吗

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

简单地说,您不能这样做,因为ArrayList中没有任何额外的类型信息。它只是
对象
s

我们可以检查整个arraylist模型类型而不获取其对象吗

ArrayList
仅保存类型为
Object
的元素。因此,检查第一个元素并不能保证整个数组属于该类型。虽然有一个编译时检查(ArrayList),但在运行时,您必须迭代所有元素,并使用
instanceof
进行检查,以确保它们是您想要的类型

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

简单地说,您不能这样做,因为ArrayList中没有任何额外的类型信息。它只是
对象
s

我们可以检查整个arraylist模型类型而不获取其对象吗


ArrayList
仅保存类型为
Object
的元素。因此,检查第一个元素并不能保证整个数组属于该类型。尽管有一个编译时检查(ArrayList),但在运行时,您必须迭代所有元素,并使用
instanceof
进行检查,以确保它们是您想要的类型。

您可以使用Java
反射来实现这一点

有一个例子:

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.
    }
}
这样,您的
ArrayList
就不需要有任何项目

没有它,就不可能在运行时获得相对泛型类型,因为泛型在编译时会被数据类型擦除


您可以使用Java
反射实现这一点

有一个例子:

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.
    }
}
这样,您的
ArrayList
就不需要有任何项目

没有它,就不可能在运行时获得相对泛型类型,因为泛型在编译时会被数据类型擦除


不明白为什么。你能在OrkhanAlikhanov发表你的评论吗?你不是完全正确。我的原始解决方案是
列表中的一个变量示例。但是,您可以以非常类似的方式在
堆栈
列表中的变量中使用反射。我用这个解决方案更新了我的答案,用Java 8试试看,我不明白为什么。你能在OrkhanAlikhanov发表你的评论吗?你不是完全正确。我的原始解决方案是
列表中的一个变量示例。但是,您可以以非常类似的方式在
堆栈
列表中的变量中使用反射。我用这个解决方案更新我的答案用Java 8试试