如何在 ArrayList 中检索包含<Object>两种不同对象类型数组列表的值..?



我有两个类型为ArrayList<ObjectType1>ArrayList<ObjectType2>的ArrayList。

然后我创建了另一个ArrayList<Object>作为对象是每个对象类型的超类。

ArrayList<Object1> obj1 = new ArrayList<Object1>();
ArrayList<Object2> obj2 = new ArrayList<Object2>();

这两个对象类都有自己特定的getter和setter方法。

ArrayList<Object> obj3 = new ArrayList<Object>();

obj3.add(obj1);
obj3.add(obj2);

现在当我访问obj3时,我想获取obj1和obj2的getter和setter。

有谁能帮我解决这个问题吗?

你可以这样做:

ArrayList<MyClass1> obj1 = new ArrayList<MyClass1>();
ArrayList<MyClass2> obj2 = new ArrayList<MyClass2>();
ArrayList<Object> obj3 = new ArrayList<Object>();
obj3.add(obj1); 
obj3.add(obj2);
for (int = 0 ; i < obj3.size() ; i++) {
    Object obj = obj3.get(i);
    if (obj instanceof MyClass1) {
        MyClass1 cls1 = (MyClass1)obj;
        cls1.get()..//You getters and setters
    }
    if (obj instanceof MyClass2) {
        MyClass2 cls2 = (MyClass2)obj;
        cls2.get()..//You getters and setters
    }
}

或者你可以做一些更聪明的事情,创建一个接口或抽象类/基类

public Interface Getable {
    void getAttrbiute();
}

然后在MyClass1, MyClass2中实现。在这种情况下,您可以遍历列表而无需强制转换和instaceof检查

ArrayList<MyClass1> obj1 = new ArrayList<MyClass1>();
ArrayList<MyClass2> obj2 = new ArrayList<MyClass2>();
ArrayList<Getable> obj3 = new ArrayList<Getable>();
obj3.add(obj1); 
obj3.add(obj2);
for (int = 0 ; i < obj3.size() ; i++) {
   Getable objGetable = obj3.get(i);
   objGetable.getAttrbiute();
 }

如果是扩展范围很少的简单对象,可以使用instanceof为例

class ObjectType1 {
    String getData1() {
        return "data 1";
    }
}
class ObjectType2 {
    String getData2() {
        return "data 2";
    }
}
private String getData(Object obj) {
    if (obj instanceof ObjectType1)
        return ((ObjectType1) obj).getData1();
    else
        return ((ObjectType2) obj).getData2();
}

但是对于良好的编程实践,尝试使用接口或抽象基本的接口实现可能看起来像

interface DataHolder{
    String getData();
}
class ObjectType1 implements DataHolder {
    String getData1() {
        return "data 1";
    }
    public String getData(){
        return getData1();
    }
}
class ObjectType2  implements DataHolder {
    String getData2() {
        return "data 2";
    }
    public String getData(){
        return getData2();
    }
}
List<DataHolder> dataSet = new ArrayList<DataHolder>();
private void print() {
    dataSet.add(new ObjectType1());
    dataSet.add(new ObjectType2());
    for (DataHolder iHolder : dataSet){
        System.out.println(iHolder.getData());
    }
}

您将确定从obj3中提取的对象为Object,而不是它们各自的类型。

  1. 检查通过instanceof提取的每个对象的类型,并在访问getter之前适当地强制转换。
  2. 或者,(更好的)实现一个包含适当getter的公共接口。这个接口将被obj3列表中的每个对象实现,该列表将被定义为ArrayList<MyInterface>,其中MyInterface定义了你的getter。

从根本上说,这是一个建模问题。通过将所有内容放入Objects列表中,您表示您对这些对象的所有了解都是Objects。相反,您需要在您的解决方案中利用多态性。

最新更新