Получите универсальный тип java.util. Список

Я имею;

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

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

245
задан skaffman 21 December 2009 в 11:09
поделиться

6 ответов

Если это на самом деле поля определенного класса, вы можете получить их с небольшой помощью отражения:

package test;

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

public class Test {

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

    public static void main(String... args) throws Exception {
        Field stringListField = Test.class.getDeclaredField("stringList");
        ParameterizedType stringListType = (ParameterizedType) stringListField.getGenericType();
        Class<?> stringListClass = (Class<?>) stringListType.getActualTypeArguments()[0];
        System.out.println(stringListClass); // class java.lang.String.

        Field integerListField = Test.class.getDeclaredField("integerList");
        ParameterizedType integerListType = (ParameterizedType) integerListField.getGenericType();
        Class<?> integerListClass = (Class<?>) integerListType.getActualTypeArguments()[0];
        System.out.println(integerListClass); // class java.lang.Integer.
    }
}

Вы также можете сделать это для типов параметров и возвращаемых типов методов.

Но если они находятся внутри той же области действия класса / метода, где вам нужно знать о них, то нет смысла их знать, потому что вы уже сами их объявили.

386
ответ дан 23 November 2019 в 03:05
поделиться

Краткий ответ: нет.

Вероятно, это дубликат, не могу найти подходящий прямо сейчас.

Java использует то, что называется стиранием типа, что означает во время выполнения оба объекта эквивалентны. Компилятор знает, что списки содержат целые числа или строки, и поэтому может поддерживать безопасную среду. Эта информация теряется (на основе экземпляра объекта) во время выполнения, и список содержит только «Объекты».

Вы МОЖЕТЕ немного узнать о классе, о том, какими типами он может быть параметризован, но обычно это просто что угодно что расширяет «Объект», т.е. что угодно. Если вы определяете тип как

class <A extends MyClass> AClass {....}

AClass.class будет содержать только тот факт, что параметр A ограничен MyClass, но более того, нет никакого способа сказать.

18
ответ дан 23 November 2019 в 03:05
поделиться

Во время выполнения нет, вы не можете.

Однако через отражение параметры типа доступны . Попробуйте

for(Field field : this.getDeclaredFields()) {
    System.out.println(field.getGenericType())
}

Метод getGenericType () возвращает объект Type. В данном случае это будет экземпляр ParametrizedType , который, в свою очередь, имеет методы getRawType () (в данном случае он будет содержать List.class ) и getActualTypeArguments () , который вернет массив (в данном случае длины один, содержащий либо String.class , либо Integer.class ).

4
ответ дан 23 November 2019 в 03:05
поделиться

Обычно невозможно, потому что List и List используют один и тот же класс среды выполнения.

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

3
ответ дан 23 November 2019 в 03:05
поделиться

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

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

Я бы не стал защищать этот подход, но в привязке его может быть полезно.

2
ответ дан 23 November 2019 в 03:05
поделиться

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

0
ответ дан 23 November 2019 в 03:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: