当前位置: 首页 > 知识库问答 >
问题:

在数组列表中存储多个类的对象,然后访问它们的属性

龙焱
2023-03-14

我有一类(子)对象

public class SubObjects {
    
    int depth;
    
    public SubObjects(int d) {
        this.depth = d;
    }
}

和一类对象

public class Objects {
    
    private int height;
    private int width;
    ArrayList<SubObjects> liste;
    
    public Objects(int h, int w) {
        this.height = h;
        this.width = w;
        this.liste = new ArrayList<>();
    }
}

这些对象包含高度和宽度值以及子对象的阵列列表。这可以按预期工作,但是我确实希望在这些ArrayList中存储来自不同类的多种类型的子对象。

经过一点谷歌搜索,我将对象类更改为

public class Objects {
    
    private int height;
    private int width;
    ArrayList<Object> liste;
    
    public Objects(int h, int w) {
        this.height = h;
        this.width = w;
        this.liste = new ArrayList<Object>();
    }
}

这使我能够像预期的那样,在ArrayList中存储来自第二类子对象2的对象

public class SubObjects2 {
    
    int weight;
    
    public SubObjects2(int weight) {
        this.weight = weight;
    }
}

这很好,我认为我已经解决了这个问题,但随后我运行了main类,而使用早期的实现,我可以使用getter从ArrayList中的对象返回值

... liste.get(i).depth (in a for loop)

同一查询现在返回以下错误

Unresolved compilation problem: 
    depth cannot be resolved or is not a field

现在如何访问存储在ArrayList中的子对象内的值?

共有2个答案

梁成双
2023-03-14

如果两个类之间没有关系,除了它们都扩展了所有对象都扩展的对象类,并且您希望将这两个类的对象存储在同一个列表中,那么您可以将它们存储在对象列表中。

在访问对象的属性之前,需要将其强制转换为要使用的类型。这是在泛型之前的做法。

        List list = new ArrayList(List.of(Integer.valueOf(1), "hello"));
        
        for(Object o: list){
            if (o instanceof Integer){
                System.out.println("o is an integer.");
                Integer i = (Integer) o;
                System.out.println(i.intValue());
            } else if (o instanceof String){
                System.out.println("o is a string.");
                String s = (String) o;
                System.out.println(s.length());
        }
    }
慕逸仙
2023-03-14

您的问题是对象类没有名为深度的字段,只有子对象具有此属性

如果你所有的类型都有你想要的公共属性,你可以创建一个接口,所有的类型都应该实现它,例如

interface SubObject {
    int value();
}

public class SubObjects implements SubObject {

    ...

    @Override
    public int value() {
        return depth;
    }
}

public class SubObjects2 implements SubObject {

    ...

    @Override
    public int value() {
        return weight;
    }
}
       

现在,您将创建一个SubObject列表,在循环中,它将

for (int i = 0; i < lists.size() ; i++) {
    int value = lists.get(i).value();
}

另一种解决方案是检查类型并在获取值之前强制转换它

List<Object> lists = new ArrayList<>();
for (int i = 0 ; i < lists.size(); i++) {
    Object object = lists.get(i);
    if (object.getClass() == SubObjects.class) {
        SubObjects subObject = (SubObjects) object;
        int depth = subObject.depth;
    }
    
    else if if (object.getClass() == SubObjects2.class) {
        SubObjects2 subObject2 = (SubObjects2) object;
        int weight = subObject2.weight;
    }
}
 类似资料:
  • 每个类都有一些独特的字段。所有最大的功能是:添加,更新,删除,查找,显示列表,保存,加载文件 -所以,首先我将创建一个名为Product的类,它有4个公共字段。以上课程将从产品延伸。 -然后,我想我可能会创建一个ComputerStore类,它有一个字段是items类型ArrayList。items存储所有的对象,这些对象是上述4个类的实例,但我不确定。

  • 我目前正在用Spring Boot和Thymeleaf做一个项目,以了解两者的基本知识。现在我被一个问题卡住了,这个问题看起来很容易,但我无法掌握它的窍门。我只是有一个名为“电影”的现有对象,我想编辑它并将覆盖的版本保存到数据库中。现在我所要做的就是用电影的数据填充一个表单。这很好,但问题是,因为一部电影可以有多个演员,所以我在每个电影对象中保存了一个演员的数组列表,其中有一个名为name的属性。

  • 问题内容: 我不知道这是否可能,但是可以。使用回调使工作变得更加困难。 我有一个包含html文件的目录,我想使用node.js和socket.io将它们以对象块的形式发送回客户端。 我所有的文件都在/ tmpl中 因此,套接字需要读取/ tmpl中的所有文件。 对于每个文件,必须将数据存储在对象中,文件名作为键,内容作为值。 最后的回调也是错误的。目录中的所有文件完成后,必须调用它。 但是我不知道

  • 问题内容: 我需要从给定列表中选择一些元素,知道它们的索引。假设我要创建一个新列表,该列表包含给定列表[-2、1、5、3、8、5、6]中索引为1、2、5的元素。我所做的是: 有什么更好的方法吗?像c = a [b]? 问题答案: 您可以使用: 或者您可以使用numpy: 但实际上,您当前的解决方案很好。这可能是所有人中最整洁的。

  • 我有一个x,y,z坐标的三个向量 我想压缩他们有一个5x3的坐标数组。但当我做的时候 然后试着打印coords,我得到 我也不能策划他们, 如何获得5x3阵列?

  • 问题内容: 通过多个属性对数组中的元素进行分组最符合我的问题,因为它确实通过数组中的多个键对对象进行了分组。问题是此解决方案无法汇总属性值,然后删除重复项,而是将所有重复项嵌套在二维数组中。 预期行为 我有一个对象数组,必须按和进行分组。 这个数组中的对象被视为重复仅当其和是相同的。如果它们是,我想分别总结它们的和值,然后删除重复项。 因此,在这个例子的结果阵列可以仅含有四种组合:,,, 问题 我

  • 按多个属性对数组中的元素进行分组最符合我的问题,因为它确实是按数组中的多个键对对象进行分组的。问题是,这种解决方案不求和属性值,然后删除重复项,而是将所有重复项嵌套在二维数组中。 预期行为 我有一个对象数组,必须按和分组。 此数组中的对象只有在它们的和相同时才被认为是重复的。如果是,我想分别总结它们的和值,然后删除重复项。 因此,在这个示例中,结果数组可能只包含四种组合:,,, 问题 我在这里尝试

  • 我必须创建以下程序: 创建一个允许您键入名称的程序。用户键入并提交(使用enter键)的名称应存储在arraylist中。然后,arraylist中的名称应打印在屏幕上。 我的问题是,我只能在我的数组列表中存储一个名字。 我的代码: 第一个问题是,在键入一个名称并提交后,您不能键入任何内容,因此我必须重置输入,如使用整数值: