Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按顺序存储不同种类的对象,并根据它们的属性使用它们_Java_Arraylist - Fatal编程技术网

Java 按顺序存储不同种类的对象,并根据它们的属性使用它们

Java 按顺序存储不同种类的对象,并根据它们的属性使用它们,java,arraylist,Java,Arraylist,我已经看到一个人可以使用 ArrayList objectList=new ArrayList() 以生成可能包含不同类型对象(例如对象a和对象B)的列表。我也看到了一些答案,州政府可以通过使用 for (Object obj : objectList){ if(obj.getClass() == A.class){ doSomething(); } } 然而,有人提到,这不是一个非常优雅的方法。另一方面,如果使用抽象类或接口,则需要对对象A和对象B使用

我已经看到一个人可以使用
ArrayList objectList=new ArrayList()
以生成可能包含不同类型对象(例如对象a和对象B)的列表。我也看到了一些答案,州政府可以通过使用

for (Object obj : objectList){
     if(obj.getClass() == A.class){
         doSomething();
     } 
}
然而,有人提到,这不是一个非常优雅的方法。另一方面,如果使用抽象类或接口,则需要对对象A和对象B使用相同的方法。例如,如果A.get()返回一个整数,则B.get()也必须返回一个整数。但我想要的是,使用objectList的方法将对objectList中包含的不同对象执行不同的操作。因此,A.get()可能返回一个整数,B.get()可能返回一个字符串

所以我想问你们的是什么是最好的方法?写“黑客”并不难,但我想写好代码


谢谢。

如果您的方法
doSomething()
高度依赖对象的类型,您可以将其移动到这些对象并使用接口

public interface Foo {
    void doSomething();
}

public class A implements Foo {
    public void doSomething() {
        // do something
    }
}


for (Foo obj : objectList){
    obj.doSomething();
}
这在很大程度上取决于在
doSomething()
中执行的操作。如果每个对象的情况确实不同,那么这种方法可能有效。如果类似,请尝试仅识别差异并将其封装在如上所示的界面中。

像这样吗

public  class BaseClass {
    public void method() {}
}
二,

三,

四,

公共类客户端{
公共静态void main(字符串[]args){
List obj=new LinkedList();
对象添加(新的ChildOne());
obj.add(newchildtwo());
用于(基本b类:obj){
((基类)b)方法();
}
}
}

我认为可以使用泛型对象,如果您有相同的方法名,请使用instanceof操作符=>
if(obj instanceof a)
而不是
obj.getClass()==a.class
,请看下面的答案:为什么我对这篇文章的评分为-1?我确实使用了正确的语法,我不只是在我的问题中复制了一些大段代码,我使我的问题很容易理解(你们所有人都立即理解了我的问题)。那怎么了?!Thx.如果
方法
未在
基类
中实现,则将其设置为抽象类或接口。事实上,我试图使其尽可能简单,是的接口方法是好的不,不是这样的。因为在我的例子中,两个类ChildOne和ChildTwo都返回不同的值(在您的示例中都返回void)。如果它们具有相同的返回类型,则使用
print(b.method)
其相同的长度。问题是我必须写一段别人写过的代码,而这段代码不是很好,所以我尽量不让它变得更糟。
public class ChildOne extends BaseClass {

    public void method() {
        System.out.println("inside ChildOne");
    }
}
public class ChildTwo extends BaseClass {

    public void method() {
        System.out.println("inside ChildTwo");
    }
}
public class Client {

    public static void main(String[] args) {
        List<BaseClass> obj = new LinkedList<>();
        obj.add(new ChildOne());
        obj.add(new ChildTwo());

        for (BaseClass b : obj) {
            ((BaseClass) b).method();
        }
    }
}