有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

o.add(person);

在对象的arraylist上添加了所有的person数据,当调用此函数时,表示我的函数名为getData()

ArrayList <Object> obj = getData();

所以我知道在调用getData()返回的ArrayList中,它是all person对象,我如何知道该ArrayList的类型

只是想让这个函数在某种意义上更通用,但这是为我的应用程序设计的,generic troughout是为我的应用程序设计的

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


共 (3) 个答案

  1. # 1 楼答案

    实际上,有一种方法不需要手动铸造每一件物品(尽管它仍然很难看)

    //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. # 2 楼答案

    不存在ArrayList的“类型”这样的东西

    ArrayList存储Object引用的列表。它不知道也不在乎它们是否都属于某种类型

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

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

  3. # 3 楼答案

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

    type = this.list.get(0).getClass().getSimpleName();