2013-02-19 5 views

ответ

4

Благодаря типа Erasure я сомневаюсь, можно ли получить его, запрещая некоторые отражения магии, которые могли бы быть в состоянии сделать это.

Но если в списке есть элементы, мы можем связаться с ними и вызвать на них getClass.

+1

downvoter забота объяснить? –

0

Вы можете попробовать это ...

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

Для этого в списке должны быть элементы, которых нет в этом вопросе. –

+0

Это то, чем было раньше! – Adelin

+0

Для этого требуется непустой массив. В противном случае это сработает. Может быть подходящим для конкретного случая, когда для пустого массива не требуется информация типа (скажем, никакой работы вообще). – h22

8

Благодаря типа стирания, единственный способ вы можете это сделать, если вы передаете тип в качестве аргумента метода.

Если у вас есть доступ к коду 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); 

Каждый ответ я видел в этом тип вопроса заключался в том, чтобы отправить класс в качестве параметра в метод.

+0

Это не ответ. –

+0

@AdamArold заботиться, чтобы объяснить, почему нет? –

+0

Читайте вопрос. –

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 объекта к методу.

+0

@Whomever downvoted: следить за комментариями? –

+1

Я думаю, что downvote не имеет права. Упреждение отрицать. –

Смежные вопросы