7

我知道如何硬编码一个算法来检查数组列表中每个对象的类型,但是有没有其他方法可以一次性检查 ArrayList<> 的类型,我的意思是我的应用程序只有三种类型的数组列表. 假设我有一个返回 ArrayList 的函数,它的定义是在变量 o 中(它当然是对象的数组列表)我将添加一个人对象,

o.add(person);

并在对象数组列表中添加了所有人员数据,当调用此函数时,我的函数的名称是 getData(),

ArrayList <Object> obj = getData();

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

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

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

4

3 回答 3

10

没有“类型”之类的东西ArrayList

该类ArrayList存储Object引用列表。它不知道也不关心它们是否都是某种类型。

Java 泛型系统添加了编译时检查来帮助您跟踪类型。因此,如果您声明ArrayList<Person>,如果您编写的代码可以Person在您的列表中插入一个非,您将得到编译错误。

在运行时,唯一的方法来告诉什么是在一个ArrayList迭代所有包含的项目和检查他们instanceof

于 2012-09-07T15:01:47.313 回答
4

实际上有一种方法不需要手动投射每个项目(虽然它仍然很丑......)

//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);
于 2015-06-18T13:24:38.807 回答
3

如果列表不为空,则获取第一个元素:

type = this.list.get(0).getClass().getSimpleName();
于 2019-11-13T19:54:09.587 回答