0

我有几个类都有DoSomething()方法。以及一个需要 Class 作为参数的单独函数:

public void DoStuff(Class c) {
     c.DoSomething();
} 

但是此代码会引发错误: DoSomething() 未为 Class 类型定义。我也尝试像这样实例化类:

public void DoStuff(Class c) {

Object o;

try {
   o = c.newInstance();
} catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
} catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
} 

然后调用 DoSomething() 方法,但我得到了同样的错误。

将类作为参数传递的正确方法是什么?

4

5 回答 5

3

创建一个interface声明您的方法的方法doSomething,如下所示:

   public interface Something {
      void doSomething();   
   }

然后让你的类实现这个接口,比如:

public class SomeClass implements Something {
    public void doSomething() {
        // do what?
    }
}

然后你可以做

public void DoStuff(Something pInstance) {
   pInstance.doSomething();
}
于 2013-02-14T13:00:13.113 回答
1

您的第一个代码示例不正确,因为c类型Class没有DoStuff()

您的第二个代码更合适,只需要将cast您的对象转换为具有DoStuff()方法的类型(例如interface,您的所有类都实现)

DoSomething()或者,您可以只使用反射调用该方法

例如,

Method method = c.getMethod("DoSomething");
Object obj = c.newInstance();
method.invoke(obj);
于 2013-02-14T12:55:55.883 回答
0

我认为您将 typeClass与 type混淆了Object。该类Object直接或间接地是您将在 Java 中创建的所有类的超类(至少在当前可用的 Java 版本中)。因为每个对象都扩展了类Object,所以您可以将每个对象传递给需要类型参数的方法Object。类型Class是完全不同的东西。该类型的对象Class(我几乎把自己弄糊涂了)是通过类文字(myInstance.class)或反射获得的。我怀疑您将一个类的实例传递给DoStuff(),因此编译器抱怨它不是该类型的对象Class。更改ClassObject你会没事的,除了你必须将该对象转换为实现的类DoSomething

于 2013-02-14T13:02:11.600 回答
0

您可以创建一个具有方法的接口,doSomething()并使所有类都实现此接口。然后,您可以调用doSomething()所有课程。

于 2013-02-14T12:55:31.150 回答
-2

我认为你真正的意思是你将一个 Object 的实例传递给你的doStuff()方法,然后这个 Object 有一个doSomething()你应该能够调用的方法。除非您有继承层次结构,否则您需要使您的方法采用类型参数Object并强制转换为您的特定Object.

public void doStuff(Object o) {
  if(o instanceof Class1) {
     Class1 c1 = (Class1)o;
     c1.doSomething();
  } 
  else if(o instanceof Class2) {
     Class2 c2 = (Class2)o;
     c2.doSomething();
  }
  else {
     ....
  }
}
于 2013-02-14T13:00:23.563 回答