我知道如何硬编码算法如何检查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.
实际上有一种方法无需手动投射每个项目(尽管它仍然很难看..)
//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)
| 归档时间: |
|
| 查看次数: |
14626 次 |
| 最近记录: |