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

lem*_*des 4 java arraylist

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

o.add(person);
Run Code Online (Sandbox Code Playgroud)

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

ArrayList <Object> obj = getData();
Run Code Online (Sandbox Code Playgroud)

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

只是希望这个函数在意义上更通用,这是我的应用程序,geniric troughout我的应用程序.

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

bma*_*ies 10

没有"类型"这样的东西ArrayList.

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

Java通用系统添加了编译时检查,以帮助您跟踪类型.因此,如果您声明ArrayList<Person>,如果编写可以将非Person插入列表的代码,则会出现编译错误.

在运行时,唯一的方法是告诉a中的内容ArrayList迭代所有包含的项并检查它们instanceof.


Leo*_*ber 5

实际上有一种方法无需手动投射每个项目(尽管它仍然很难看..)

//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....
}
Run Code Online (Sandbox Code Playgroud)

这不应该给出任何未经检查的警告。

你可以这样使用它:

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...

}
Run Code Online (Sandbox Code Playgroud)

以下内容是行不通的:

// -> This won't work, sry!
       ArrayList<Person> personArrayList = Arrays.asList((Person[])personArr);
Run Code Online (Sandbox Code Playgroud)