1

これが初心者の質問である場合は申し訳ありません。ジェネリック型をパラメーターとして持つClassオブジェクトを受け取るメソッドがあります。私は次のことができます:

Class cs = Map.class;

しかし、これを渡すと、メソッドが宣言されているため、「NoSuchMethodException」が発生します。

public void doSomething(Class<Map<Object, List<Object>>> theclass){
...     
}

私はそれを次のようにキャストしようとしました:

Class cs = (Class<Map<Object, List<Object>>>)(Class<?>)Map.class;

しかし、それでも同じ例外が発生します。

これを行う方法はありますか?

ここに完全なコードを投稿することはできませんが、エラーを再現しました。アプリケーションは実際にリフレクションを使用しています。ここに元のコードを投稿することはできませんが、例外を再現しました。

import java.lang.reflect.Method;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Class c = null;
        try {
            c = Class.forName("Second");
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }
        String m = "doSomething";
        Method method = null;
        Class cs = Map.class;
        try{
            method = c.getMethod(m, cs);
        } catch (NoSuchMethodException e){
            e.printStackTrace();
        }
    }
}

class Second{
    public static void doSomething(Class<Map<Object, List<Object>>> theclass){
        System.out.println("HERE I AM!");   
    }   
}

例外:

java.lang.NoSuchMethodException: Second.doSomething(java.util.Map)
    at java.lang.Class.throwNoSuchMethodException(Class.java:283)
    at java.lang.Class.getMethod(Class.java:825)
    at Main.main(Main.java:16)
4

2 に答える 2

1

あなたがそのようなキャスティングをしているなら、あなたはあなたを助けるように設計された型システムと戦っていると思います。手始めに、

Class cs = Map.class;

生のタイプです(詳細については、ここを参照してください)。必要なタイプのクラスをインスタンス化し、そのクラスを関数Mapに渡してみましたか?

例えば

(new HashMap<Object, List<Object>>()).getClass();

注:上記のコメントに記載されているように、マップインターフェイスのインスタンスを渡す必要があるため、上記のメソッド宣言ではこれが禁止されます。基本的に、ここには基本的なAPI設計の問題があります。

于 2012-09-24T12:08:53.610 に答える
1

とった!次の行を変更しました。

method = c.getMethod(m, cs);

に:

method = c.getMethod(m, cs.getClass());

今それは動作します!

于 2012-09-24T12:47:26.450 に答える