2013-10-08 4 views
11

Мой проект включает отражение, и в настоящее время я обрабатываю общие типы. мне удалось получить общий тип из списка (java.util.List) с:Java получить общий тип коллекции

if(originalField.getGenericType() instanceof ParameterizedType){ 
    ParameterizedType pt = (ParameterizedType) originalField.getGenericType(); 
    Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0]; 
} 

У меня также есть Collection<String> и получается, что коллекция может НЕ быть отлиты в ParameterizedType.

У кого-то есть идея, как получить String (или любой другой тип, который будет) из коллекции?

Я читал о стирании Java, поэтому я знаю об этом, но после получения родового из списка я подумал, что, возможно, кто-то знает еще один «трюк».

Спасибо.

Редакция: Я итерация по всем полям класса с:

for (Field originalField : someClass.getDeclaredFields()) 

А потом, когда я столкнулся некоторые List<String> поле с кодом выше я получаю String как Подкласс переменная.

+1

Вы можете показать еще какой-то код. Неясно, что здесь происходит. Если метод работает для 'List', по причине он не будет работать для' Collection'. –

+0

Даже если вы получаете общий тип поля, вы не можете с ним справиться. Какова цель в вашем случае? –

+0

Rohit Jhon - код действительно работает для List, но не для Collection. Во время выполнения он сказал, что Collection нельзя передать в ParameterizedType (как я упоминал в вопросе). Sotirious Delimanolis - Цель этого кода - сгенерировать код, чтобы я получил тип общего – Gumba

ответ

12

Ваш подход прекрасно. Он должен работать как для List<String>, так и для Collection<String>. Для примера см этот пример кода:

public class Demo { 

    List<String> list = new ArrayList<>(); 
    Collection<String> coll = new ArrayList<>(); 

    public static void main(String args[]){ 

     Class<Demo> clazz = Demo.class; 
     Field[] fields = clazz.getDeclaredFields(); 

     for (Field field: fields) { 

      Type type = field.getGenericType(); 

      if (type instanceof ParameterizedType) { 

       ParameterizedType pType = (ParameterizedType)type; 
       Type[] arr = pType.getActualTypeArguments(); 

       for (Type tp: arr) { 
        Class<?> clzz = (Class<?>)tp; 
        System.out.println(clzz.getName()); 
       } 
      } 
     } 
    } 
} 

это печатает:

java.lang.String 
java.lang.String 
1

Насколько я знаю, Java полностью стирает тип, поэтому скомпилированный код не имеет следов значения, присвоенного параметрам. Все параметрические типы переведены на конкретные типы, с типом отливок и т. Д.

В коде, который я видел до сих пор, когда класс должен знать значение своего общего типа, он заставляет объект этого тип (или класс), который должен быть передан как параметр. Что-то вроде:

class A<T> { 
    private final Class<T> parameterType; 

    public A(Class<T> parCls) { 
     parameterType = parCls; 
    } 

    public A(T tObj) { 
     parameterType = tObj.getClass(); 
    } 
} 
+0

Как я упомянул в своем вопросе, я знаю об удалении java, но мне удалось (как вы можете видеть в моем коде), чтобы получить общий тип List. – Gumba

+0

Это параметр типа, а не значение, которое вы ему назначили. –

0

Вам нужно решить ParameterizedType с использованием любого типа он был определен на. Например, с помощью TypeTools:

class Foo<T> { 
    public T bar; 
} 

class StringFoo extends Foo<String> {} 

Type barType = Foo.class.getDeclaredField("bar").getGenericType(); 
Class<?> t = TypeResolver.resolveRawClass(barType, StringFoo.class); 
assert t == String.class; 

Здесь величина T была определена в StringFoo, поэтому мы можем использовать TypeResolver разрешить необработанный класс для типа нашего месторождения с использованием StringFoo

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