2013-02-19 214 views
1

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

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

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

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

+1

downvoter谨慎解释? – 2013-02-19 11:10:05

0

你可以试试这个...

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

为了这个工作,应该有列表中的元素,这是不存在的问题。 – 2013-02-19 09:07:53

+0

这就是以前的样子! – Adelin 2013-02-19 09:21:55

+0

这需要非空数组。否则会工作。可能适用于空数组不需要任何类型信息(根本不需要工作)的特定情况。 – h22 2013-02-20 20:09:15

8

由于类型擦除,你可以做到这一点的唯一方法是,如果你通过类型作为参数传递给方法。

如果你有访问数据存储的代码,并可以修改你可以试试这样做:

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

,然后通过做

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

我已经看到了这个每个响应叫它问题的类型是将类作为参数发送给方法。

+0

这不是一个答案。 – 2013-02-19 09:19:55

+0

@AdamArold谨慎解释为什么不呢? – 2013-02-19 09:28:54

+0

阅读问题。 – 2013-02-19 09:39:02

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(); 
    } 
} 

您可以从类或字段中获取类型参数,但它不适用于泛型方法。尝试使用非泛型方法!

OR

另一种解决方案可能会被传递的实际Class对象的方法。

+0

@Hhomever downvoted:关心评论? – 2013-04-13 12:34:26

+1

我认为downvote是不需要的。 Upvoting否定。 – 2017-11-24 02:18:15