我知道如何硬编码算法如何检查arraylist中每个对象的类型,但是在检查ArrayList的类型时还有其他方法<>一次性,我的意思是我的应用程序只有三种类型的arraylist。假设我有一个返回ArrayList的函数,它的定义是变量o(它是一个对象的arraylist),我将添加一个person对象,
o.add(person);
并在对象的arraylist上添加了所有人物数据,当调用此函数时,我的函数名称为getData(),
ArrayList <Object> obj = getData();
所以我知道在我从调用getData()返回的那个ArrayList中,它是所有person对象,我怎么知道那个ArrayList的类型?
只是希望这个功能在意义上更通用,这适用于我的应用程序,geniric troughout我的应用程序。
有没有其他方法可以做到这一点,我可以想到一个算法,但有没有任何捷径或简单方法这样做?...
答案 0 :(得分:9)
没有ArrayList
的'类型'这样的东西。
类ArrayList
存储Object
引用列表。它不知道也不关心它们是否属于某种类型。
Java通用系统添加编译时检查以帮助您跟踪类型。因此,如果您声明ArrayList<Person>
,如果您编写的代码可能会在您的列表中插入非Person
,则会出现编译错误。
在运行时,唯一的方法是告诉ArrayList
中的内容迭代所有包含的项目并使用instanceof
进行检查。
答案 1 :(得分:3)
实际上有一种方法可以不用手动铸造每一件物品(尽管它仍然很丑陋......)
//start with an arraylist of unknown generic type
ArrayList <Object> obj = getData();
//Make an array from it(basically the same as looping over the list
// and casting it to the real type of the list entries)
Object[] objArr = obj.toArray();
//Check if the array is not empty and if the componentType of the
//array can hold an instance of the class Person
if(objArr.length>0
&& objArr.getClass().getComponentType().isAssignableFrom(Person.class)) {
// do sth....
}
这不应该给出任何未经检查的警告。
您可以像这样使用它:
private boolean isArrayOfType(Object[] array,Class<?> aClass) {
return array.length > 0
&& array.getClass().getComponentType().isAssignableFrom(aClass);
}
Object[] personArr = getData().toArray();
if(isArrayOfType(personArr,Person.class) {
//Do anything...
}
以下内容不起作用:
// -> This won't work, sry!
ArrayList<Person> personArrayList = Arrays.asList((Person[])personArr);
答案 2 :(得分:0)
如果列表不为空,请获取第一个元素:
type = this.list.get(0).getClass().getSimpleName();