メソッドに渡された引数の型引数を取得する方法は? たとえば、私は
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 ;
}
}
型消去のため、これを行う唯一の方法は、型を引数としてメソッドに渡すことです。
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);
このタイプの質問に対して私が見たすべての回答は、クラスをパラメーターとしてメソッドに送信することでした。
Type Erasure のせいで、それができるかどうかは疑わしい。
しかし、リスト内に要素がある場合は、それらに手を伸ばして getClass を呼び出すことができます。
あなたにはそれができないと思います。このクラスをチェックしてください:
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
別の解決策として、実際のオブジェクトをメソッドに渡すことがあります。
これを試すことができます...
if(tList != null && tList.size() > 0){
Class c = tList.get(0).getClass();
}