0

DoSomething()メソッドを含むクラスがいくつかあります。そして、パラメータとしてクラスを期待する別の関数:

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

しかし、このコードはエラーをスローします 。DoSomething()は型クラスに対して未定義です。また、次のようにクラスをインスタンス化してみました。

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()

2番目のコードの方が適切ですcast。オブジェクトを、メソッドを持つ型DoStuff()(たとえば、interfaceすべてのクラスが実装する型)にする必要があります。

DoSomething()または、リフレクションを使用してメソッドを呼び出すこともできます

例えば、

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

メソッドを持つインターフェイスを作成し、doSomething()すべてのクラスにこのインターフェイスを実装させることができます。doSomething()その後、すべてのクラスを呼び出すことができます。

于 2013-02-14T12:55:31.150 に答える
0

Classタイプとタイプを混同していると思いますObject。このクラスObjectは、Javaで作成するすべてのクラスの直接または間接的なスーパークラスです(少なくとも現在利用可能なバージョンのJavaを使用)。すべてのオブジェクトがクラスを拡張するためObject、タイプのパラメーターを期待するメソッドにすべてのオブジェクトを渡すことができますObject。タイプClassは全然違います。タイプのオブジェクトClass(私はそこで自分自身をほとんど混乱させました)は、クラスリテラル(myInstance.class)またはリフレクションによって取得されます。クラスのインスタンスをに渡したと思われるDoStuff()ので、コンパイラはそれがタイプのオブジェクトではないと文句を言いましたClassClassに変更Objectそのオブジェクトを実装するクラスにキャストする必要があることを除いて、問題はありません。DoSomething

于 2013-02-14T13:02:11.600 に答える
-2

あなたが本当に意味しているのは、オブジェクトのインスタンス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 {
     ....
  }
}
于 2013-02-14T13:00:23.563 に答える