Java 如何在Android中获取ArrayList的模型数据类型?
下面的onFilter()方法为我提供了一个数组列表,但我有不同的arraylist和不同的模型, e、 g:ArrayList,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
@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试试