【问题标题】:How to retrieve a value in ArrayList<Object> where it contains two different object type arraylist..?如何在 ArrayList<Object> 中检索一个值,其中包含两个不同的对象类型 arraylist..?
【发布时间】:2014-05-27 11:31:31
【问题描述】:

我有两个 ArrayList&lt;ObjectType1&gt;ArrayList&lt;ObjectType2&gt; 类型的 ArrayList。

然后我创建了另一个ArrayList&lt;Object&gt;,因为对象是每个对象类型的超类。

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。??

谁能帮忙解决一下..???

【问题讨论】:

  • 你尝试了什么?
  • “我想获取 obj1 和 obj2 的 getter 和 setter”是什么意思?

标签: java android object arraylist


【解决方案1】:

你可以这样做:

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

希望对您有所帮助..

【讨论】:

  • 当我在做 obj3.size 时,我得到了一个确定的尺寸,但是当我在下一步做 obj3.get(i) 时它返回 null,为什么会这样?
  • 也许在 obj1 , obj2 中你在其中一个节点中插入了 null ?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您会发现您从obj3 拉取对象为Object,而不是它们各自的类型。

    您可以:

    1. 检查通过instanceof 提取的每个对象的类型,并在访问getter 之前进行适当的转换。这很讨厌。
    2. 或者,(更好)实现一个包含适当 getter 的通用接口。此接口将由您的obj3 列表中的每个对象实现,该列表将定义为ArrayList&lt;MyInterface&gt;,其中MyInterface 定义您的getter。

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

    【讨论】:

    • 你能举个例子来说明你的第二个选择吗?
    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 2018-03-26
    • 2023-04-03
    • 2012-03-10
    • 1970-01-01
    • 2021-01-20
    • 2010-09-11
    • 1970-01-01
    相关资源
    最近更新 更多