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

7
如何获取传递给方法的参数的类型参数?例如,我有:
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 ; 
  }
} 

9
在我看来,这个问题不是重复的。撇开参考问题中信息丰富且非常有用的答案,这个问题关于方法的通用参数(而不是类),这在SO上通常是一个不太被讨论的主题。当然,与类不同,在这种情况下没有问题的解决方案。 - Tomáš Záluský
4个回答

14
由于类型擦除的原因,唯一的方法是将类型作为参数传递给方法。
如果您可以访问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);

我看到的对于这种类型问题的每个回答都是将类作为参数传递给方法。


4

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

但是如果列表中有元素,我们可以访问它们并调用它们的getClass方法。


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

0

你可以尝试这个...

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

1
为了使其工作,列表中应该有元素,但问题中没有。 - Ajay George
这是以前的样子! - Adelin
1
这需要非空数组。否则会起作用。当空数组不需要任何类型信息(比如根本不工作)时,可能适用于特定情况。 - Audrius Meškauskas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接