4

呼び出すメソッドに arraylist 型の引数を渡したいと思います。

いくつかの構文エラーが発生しているので、これは何が問題なのか疑問に思っていました。

シナリオ 1:

// i have a class called AW
class AW{}

// i would like to pass it an ArrayList of AW to a method I am invoking
// But i can AW is not a variable
Method onLoaded = SomeClass.class.getMethod("someMethod",  ArrayList<AW>.class );
Method onLoaded = SomeClass.class.getMethod("someMethod",  new Class[]{ArrayList<AnswerWrapper>.class}  );

シナリオ 2 (同じではありませんが、似ています):

// I am passing it as a variable to GSON, same syntax error
ArrayList<AW> answers = gson.fromJson(json.toString(), ArrayList<AW>.class);
4

2 に答える 2

5

AWあなたの(主な)間違いは、getMethod()引数に不要なジェネリック型を渡すことです。私はあなたのものに似ているが機能している簡単なコードを書こうとしました。うまくいけば、それはあなたの質問の(いくつかの)答えになるかもしれません:

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

public class ReflectionTest {

  public static void main(String[] args) {
    try {
      Method onLoaded = SomeClass.class.getMethod("someMethod",  ArrayList.class );
      Method onLoaded2 = SomeClass.class.getMethod("someMethod",  new Class[]{ArrayList.class}  );    

      SomeClass someClass = new SomeClass();
      ArrayList<AW> list = new ArrayList<AW>();
      list.add(new AW());
      list.add(new AW());
      onLoaded.invoke(someClass, list); // List size : 2

      list.add(new AW());
      onLoaded2.invoke(someClass, list); // List size : 3

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

}

class AW{}

class SomeClass{

  public void someMethod(ArrayList<AW> list) {
    int size = (list != null) ? list.size() : 0;  
    System.out.println("List size : " + size);
  }

}
于 2012-12-14T10:21:50.120 に答える
2

クラス リテラルはそのようにパラメーター化されませんが、幸いなことにまったく必要ありません。消去により、ArrayList をパラメーターとして持つメソッドは 1 つしかないため (ジェネリックでオーバーロードすることはできません)、ArrayList.class を使用して適切なメソッドを取得できます。

GSON では、TypeTokenクラス リテラルがジェネリクスを表現しないという事実に対処するクラスを導入します。

于 2012-12-14T10:10:23.287 に答える