Получить универсальный тип java.util.List - PullRequest
234 голосов
/ 22 декабря 2009

у меня есть;

List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();

Есть ли (простой) способ получения универсального типа списка?

Ответы [ 14 ]

2 голосов
/ 22 декабря 2009

Как уже говорили другие, единственный правильный ответ - нет, тип был удален.

Если список содержит ненулевое количество элементов, вы можете исследовать тип первого элемента (например, используя его метод getClass). Это не скажет вам универсальный тип списка, но было бы разумно предположить, что универсальный тип был неким суперклассом типов в списке.

Я бы не защищал такой подход, но в безвыходном положении он может быть полезен.

1 голос
/ 05 мая 2011
import org.junit.Assert;
import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class GenericTypeOfCollectionTest {
    public class FormBean {
    }

    public class MyClazz {
        private List<FormBean> list = new ArrayList<FormBean>();
    }

    @Test
    public void testName() throws Exception {
        Field[] fields = MyClazz.class.getFields();
        for (Field field : fields) {
            //1. Check if field is of Collection Type
            if (Collection.class.isAssignableFrom(field.getType())) {
                //2. Get Generic type of your field
                Class fieldGenericType = getFieldGenericType(field);
                //3. Compare with <FromBean>
                Assert.assertTrue("List<FormBean>",
                  FormBean.class.isAssignableFrom(fieldGenericType));
            }
        }
    }

    //Returns generic type of any field
    public Class getFieldGenericType(Field field) {
        if (ParameterizedType.class.isAssignableFrom(field.getGenericType().getClass())) {
            ParameterizedType genericType =
             (ParameterizedType) field.getGenericType();
            return ((Class)
              (genericType.getActualTypeArguments()[0])).getSuperclass();
        }
        //Returns dummy Boolean Class to compare with ValueObject & FormBean
        return new Boolean(false).getClass();
    }
}
0 голосов
/ 25 октября 2017

Используйте Reflection, чтобы получить Field для них, тогда вы можете просто сделать: field.genericType, чтобы получить тип, который также содержит информацию об универсальном.

0 голосов
/ 22 декабря 2009

Тип стирается, поэтому вы не сможете. См http://en.wikipedia.org/wiki/Type_erasure и http://en.wikipedia.org/wiki/Generics_in_Java#Type_erasure

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...