java:如何检查整个ArrayList的类型

时间:2012-09-07 14:48:33

标签: java arraylist

我知道如何硬编码算法如何检查arraylist中每个对象的类型,但是在检查ArrayList的类型时还有其他方法<>一次性,我的意思是我的应用程序只有三种类型的arraylist。假设我有一个返回ArrayList的函数,它的定义是变量o(它是一个对象的arraylist),我将添加一个person对象,

o.add(person);

并在对象的arraylist上添加了所有人物数据,当调用此函数时,我的函数名称为getData(),

ArrayList <Object> obj = getData();

所以我知道在我从调用getData()返回的那个ArrayList中,它是所有person对象,我怎么知道那个ArrayList的类型?

只是希望这个功能在意义上更通用,这适用于我的应用程序,geniric troughout我的应用程序。

有没有其他方法可以做到这一点,我可以想到一个算法,但有没有任何捷径或简单方法这样做?...

3 个答案:

答案 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();