5

Double型またはInteger型、またはその他の型の文字列があります。最初に Double または Integer オブジェクトを作成し、それをオーバーロードされたメソッドに送信する必要があります。これまでのコードは次のとおりです。

public void doStuff1(object obj, String dataType){

 if ("Double".equalsIgnoreCase(dataType)) {
        doStuff2(Double.valueOf(obj.toString()));
    } else if ("Integer".equalsIgnoreCase(dataType)) {
        doStuff2(Integer.valueOf(obj.toString()));
    }

 }

 public void doStuff2(double d1){
   //do some double related stuff here
 }

 public void doStuff2(int d1){
   //do some int related stuff here
 }

このようなもので、if/else なしでこれを行いたいと思います。

Class<?> theClass = Class.forName(dataType);

問題は、「theClass」を double または int にキャストできないことです。どんなアイデアにも感謝します。ありがとう。

関連するスレッドを見つけました。Java でのオーバーロードと複数のディスパッチ

4

4 に答える 4

4

これは、プリミティブ型を扱うだけの問題ではありません。

どのメソッドを呼び出すかはコンパイル時に決定されます。つまり、引数の型に応じて異なるメソッドを呼び出せるようにしたい場合は、複数の呼び出しが必要になります (つまり、if-construct が必要です)。

言い換えれば、引数として受け取っても機能しません(doStuff2あなたのコードは基本的にそれが得られるのと同じくらい良いです)。IntegerDouble

(派手な言葉で言えば、これは Java が単一の dispatchを持っているという事実によるものです。複数のディスパッチをエミュレートするには、条件ステートメントまたはビジター パターンを使用する必要があります。)

于 2012-05-02T10:39:38.407 に答える
1

aioobeが言うように、オーバーロードされたメソッド間の選択は、引数の静的タイプに基づいてコンパイル時に行われます。

実行時に過負荷の選択をシミュレートする場合は、考えられるさまざまな方法の複雑な実行時分析を行う必要があります。それは次のようになります:

  1. を宣言したクラスのすべての宣言されたメソッドを取得しdoStuff2ます。
  2. 名前が。ではないメソッドを除外しますdoStuff2
  3. 引数値の(動的)型から引数型を割り当てることができないメソッドを除外します。
  4. 残りの方法のうち、最も一致する方法を選択してください...あいまいな「関係」に対処するように注意してください。

これはコーディングが難しく、プリミティブ型の処理も行う場合は注意が必要です。また、メソッド呼び出しにコストがかかります。


率直に言って、ある種の有線ディスパッチははるかに簡単です。if / elseテスト(またはJava 7で文字列をオンにする)が気に入らない場合は、次のようにすることができます。

Map<String, Operation> map = ...
map.put("Double", new Operation(){
    public void doIt(Object obj) {
        doStuff2((Double) obj);
    }});
map.put("Integer", new Operation(){
    public void doIt(Object obj) {
        doStuff2((Integer) obj);
    }});
...
map.get(typeName).doIt(obj);

...少なくとも、新しいタイプのサポートを動的に「プラグイン」することができます。

于 2012-05-02T11:00:28.360 に答える
1

別の答えが示したように、メソッド呼び出しはコンパイル時に決定されるため、オーバーロードは機能しません。この問題は相続で解決できると思います。したがって、基本クラスをで記述yourMethod()し、派生クラスでオーバーライドします。

于 2012-05-02T11:00:31.857 に答える
1

リフレクションに頼る場合は、プリミティブ型を特別に処理するだけで済みます。したがって、あなたの手法は機能しますが、いくつかの明示的なテストを追加する必要があります。プリミティブを受け入れるメソッドを反射的に見つける必要がある場合はdouble、 を使用しますdouble.class

于 2012-05-02T11:17:04.493 に答える