将不同的类作为参数传递给函数Java

时间:2013-02-14 12:53:01

标签: java class parameter-passing

我有几个类都有 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()方法,但我得到了同样的错误。

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

5 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

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

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

或者,您可以使用反射

调用方法DoSomething()

如,

Method method = c.getMethod("DoSomething");
Object obj = c.newInstance();
method.invoke(obj);

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:-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 {
     ....
  }
}