以下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模型类型而不获取它的对象吗?
答案 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
不需要任何项目。
没有它,无法在运行时获取相对泛型类型,因为在泛型编译时数据类型擦除。