如何在ArrayList <object>中检索一个值,它包含两个不同的对象类型arraylist ..?</object>

时间:2014-05-27 11:31:32

标签: java android object arraylist

我有两个类型为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。??

任何人都可以帮忙解决问题.. ???

3 个答案:

答案 0 :(得分:3)

你可以这样做:

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();
 }

希望有所帮助..

答案 1 :(得分:0)

您已经确定将obj3中的对象作为Object,而不是其各自的类型。

你可以:

  1. 检查通过instanceof提取的每个对象的类型,并在访问getter之前进行适当的转换。这非常讨厌。
  2. 或者,(更好)实现包含适当getter的公共接口。此界面将由obj3列表中的每个对象实施,该列表将定义为ArrayList<MyInterface>,其中MyInterface定义您的获取者。
  3. 从根本上说,这是一个建模问题。通过将所有内容放入Objects列表中,您可以说您对这些对象的所有了解都是Objects。相反,您需要在解决方案周围使用polymorphism

答案 2 :(得分:0)

如果它是一个扩展范围很小的简单对象,你可以使用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());
    }
}