【问题标题】:Pass different classes as parameters to a function Java将不同的类作为参数传递给函数 Java
【发布时间】:2013-01-30 06:46:57
【问题描述】:

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

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

但是这段代码会抛出错误:DoSomething() 没有为 Class 类型定义。我也尝试过像这样实例化 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() 方法,但我得到了同样的错误。

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

【问题讨论】:

  • 您的第二种方法似乎是正确的。你能发布整个错误消息吗?
  • DoStuff() != DoSomething()
  • 实际上是一个实例。我不应该有?
  • “需要一个类作为参数”你确定吗??
  • @ogzd 你的意思是什么?不一样是的,但是???

标签: java class parameter-passing


【解决方案1】:

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

【讨论】:

  • 谢谢我想到了这个。如果没有更简单的方法我会这样做。
【解决方案2】:

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

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

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

例如,

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

【讨论】:

  • 是的,但我并不总是知道那个对象会是哪一个。我有几个具有 DoStuff() 方法的对象。我想要一个通用的方法来传递这些对象。
  • 只需使用反射来调用方法,或者为所有类提供一个通用接口
  • 这是处理线程的好方法吗?如果 DoStuff() 与 main() 位于不同的线程中
  • 你可以让你的DoStuff()方法成为线程安全的,不管你用什么方法来调用它(即反射或通过接口)
【解决方案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();
}

【讨论】:

  • void doSomething() 对于所有 SomeClass-es 必须不同。
  • 很好的例子,但是让另一个类实现该接口会很酷,并显示一些循环实现的代码,例如: List things = Arrays.asList(new SomeClass(), new其他类);然后做一个 for(Something s: thins) { s.doSomething()}.
  • @astralmaster 我不明白你的反对意见。接口中的声明没有实现。它是实现提供行为的声明方法的实际类。
【解决方案4】:

我认为你真正的意思是你将一个对象的实例传递给你的doStuff() 方法,然后这个对象有一个你应该能够调用的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 {
     ....
  }
}

【讨论】:

  • 这正是我的意思,是的,对不起。
  • 这实际上是获得所需功能的一种非常糟糕的方式。
  • @Erik 注意我说的是没有继承关系。
  • 因为你是这样把自己锁起来的。如果要添加另一个具有 doSomething() 方法的类,则需要重写此方法。这也是一种非常非 oop 的编程方式。即使实现 doSomething 的类不是你的,我也会说将它们包装在实现接口的类中。
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 2020-05-13
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多