将普通superclass的Class传给Function;函数应检查对象是否已通过 instanceof class

Pass Class of common superclass to Function; Function should check if an Object is instanceof passed class

我有不同的框架,它们扩展了存储在 ArrayList 中的 MyFrame

abstract public class MyFrame extends JFrame {
    public MyFrame(){
        super();
    }
    abstract public void update();
}

现在我想要一个传递 ArrayList 和 Class 类型列表的函数,该函数应该对传递类型的所有对象调用更新

public void foo(ArrayList<MyFrame> frames, ArrayList<Class> types){
    for(MyFrame f : frames){
        for(Class c : types){
            if(f instanceof c){
                f.update();
            }
        }
    }
}

1) 您不需要将 class 添加到 ArrayList,但您需要将 MyFrame 的实例添加到列表。

2) 然后你就可以做下面的事情了

public void foo(List<MyFrame> frames){
    for(MyFrame f : frames){
                f.update();
    }
}

Edit based on your comment

import java.util.ArrayList;
import java.util.List;


public class Main {
    public static void main(String[] args) {
        List<MyFrame> myFrameList = new ArrayList<MyFrame>();
        myFrameList.add(new A());
        myFrameList.add(new B());
        foo(myFrameList,A.class);


    }
    public static void foo(List<MyFrame> myFrameList, Class c)
    {
         for(MyFrame f:myFrameList)
        {
            if(c.isInstance(f))
            {
                f.update();
            }
        }
    }
}

abstract class MyFrame
{
     public abstract void update();
}
class A extends MyFrame
{

    @Override
    public void update() {
        System.out.println("Aaaaa");
    }

}

class B extends MyFrame
{

    @Override
    public void update() {
        System.out.println("Bbbb");
    }

}

在您的代码中,问题是 c 不是 class 名称;它是一个引用 Class 对象实例的变量。代替 instanceOf,使用:

public void foo(ArrayList<MyFrame> frames, ArrayList<Class> types){
    for(MyFrame f : frames){
        for(Class c : types){
            if(f.getClass() == c){
                f.update();
            }
        }
    }
}