将普通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();
}
}
}
}
我有不同的框架,它们扩展了存储在 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();
}
}
}
}