我有两个类型为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
,而不是它们各自的类型。
- 检查通过
instanceof
提取的每个对象的类型,并在访问getter之前适当地强制转换。 或者,(更好的)实现一个包含适当getter的公共接口。这个接口将被
obj3
列表中的每个对象实现,该列表将被定义为ArrayList<MyInterface>
,其中MyInterface
定义了你的getter。从根本上说,这是一个建模问题。通过将所有内容放入Objects
列表中,您表示您对这些对象的所有了解都是Objects
。相反,您需要在您的解决方案中利用多态性。