我有几个类都有 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()方法,但我得到了同样的错误。
将类作为参数传递的正确方法是什么?
答案 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
类型为Class
,不有DoStuff()
您的第二个代码更合适,只需要将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 {
....
}
}