5

メソッドに渡された引数の型引数を取得する方法は? たとえば、私は

List<Person> list = new ArrayList<Person>(); 

public class Datastore {

  public <T> void insert(List<T> tList) {
     // when I pass the previous list to this method I want to get Person.class ; 
  }
} 
4

4 に答える 4

12

型消去のため、これを行う唯一の方法は、型を引数としてメソッドに渡すことです。

Datastore コードにアクセスでき、変更できる場合は、次の操作を試すことができます。

public class Datastore {
    public T void insert(List<T> tList, Class<T> objectClass) {
    }
}

そして、それを呼び出す

List<Person> pList = new ArrayList<Person>();
...
dataStore.insert(pList, Person.class);

このタイプの質問に対して私が見たすべての回答は、クラスをパラメーターとしてメソッドに送信することでした。

于 2013-02-19T09:07:15.600 に答える
4

Type Erasure のせいで、それができるかどうかは疑わしい。

しかし、リスト内に要素がある場合は、それらに手を伸ばして getClass を呼び出すことができます。

于 2013-02-19T09:01:09.950 に答える
1

あなたにはそれができないと思います。このクラスをチェックしてください:

public class TestClass
{
    private List<Integer> list = new ArrayList<Integer>();

    /**
     * @param args
     * @throws NoSuchFieldException
     * @throws SecurityException
     */
    public static void main(String[] args)
    {
        try
        {
            new TestClass().getClass().getDeclaredField("list").getGenericType(); // this is the type parameter passed to List
        }
        catch (SecurityException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (NoSuchFieldException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        new TestClass().<Integer> insert(new ArrayList<Integer>());
    }

    public <T> void insert(List<T> tList)
    {
        ParameterizedType paramType;
        paramType = (ParameterizedType) tList.getClass().getGenericInterfaces()[0];
        paramType.getActualTypeArguments()[0].getClass();
    }
}

クラスまたはフィールドから型パラメーターを取得できますが、ジェネリック メソッドでは機能しません。一般的でない方法を試してみてください。

また

Class別の解決策として、実際のオブジェクトをメソッドに渡すことがあります。

于 2013-02-19T09:38:11.993 に答える
0

これを試すことができます...

if(tList != null && tList.size() > 0){
    Class c = tList.get(0).getClass();
}
于 2013-02-19T09:06:51.820 に答える