如何获取泛型方法参数的类型参数类?

时间:2013-02-19 08:54:14

标签: java generics

如何获取传递给方法的参数的类型参数?例如,我有

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 个答案:

答案 0 :(得分:10)

由于类型擦除,唯一可行的方法是将类型作为参数传递给方法。

如果您可以访问数据存储区代码并且可以修改,则可以尝试执行此操作:

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

然后通过执行

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

我在这类问题中看到的每一个回复都是将该类作为参数发送给该方法。

答案 1 :(得分:4)

由于类型擦除,我怀疑我们是否能够得到它,除非有一些可能能够做到的反射魔法。

但如果列表中有元素,我们可以联系到它们并在它们上调用getClass。

答案 2 :(得分:0)

你可以试试这个......

if(tList != null && tList.size() > 0){
    Class c = tList.get(0).getClass();
}

答案 3 :(得分:0)

我认为你做不到。看看这堂课:

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对象传递给方法。