Я имею;
List<String> stringList = new ArrayList<String>();
List<Integer> integerList = new ArrayList<Integer>();
Существует ли (легкий) способ получить универсальный тип списка?
Если это на самом деле поля определенного класса, вы можете получить их с небольшой помощью отражения:
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.
}
}
Вы также можете сделать это для типов параметров и возвращаемых типов методов.
Но если они находятся внутри той же области действия класса / метода, где вам нужно знать о них, то нет смысла их знать, потому что вы уже сами их объявили.
Краткий ответ: нет.
Вероятно, это дубликат, не могу найти подходящий прямо сейчас.
Java использует то, что называется стиранием типа, что означает во время выполнения оба объекта эквивалентны. Компилятор знает, что списки содержат целые числа или строки, и поэтому может поддерживать безопасную среду. Эта информация теряется (на основе экземпляра объекта) во время выполнения, и список содержит только «Объекты».
Вы МОЖЕТЕ немного узнать о классе, о том, какими типами он может быть параметризован, но обычно это просто что угодно что расширяет «Объект», т.е. что угодно. Если вы определяете тип как
class <A extends MyClass> AClass {....}
AClass.class будет содержать только тот факт, что параметр A ограничен MyClass, но более того, нет никакого способа сказать.
Во время выполнения нет, вы не можете.
Однако через отражение параметры типа доступны . Попробуйте
for(Field field : this.getDeclaredFields()) {
System.out.println(field.getGenericType())
}
Метод getGenericType ()
возвращает объект Type. В данном случае это будет экземпляр ParametrizedType
, который, в свою очередь, имеет методы getRawType ()
(в данном случае он будет содержать List.class
) и getActualTypeArguments ()
, который вернет массив (в данном случае длины один, содержащий либо String.class
, либо Integer.class
).
Обычно невозможно, потому что List
и List
используют один и тот же класс среды выполнения.
Вы могли бы отразить на объявленный тип поля, содержащего список (если объявленный тип сам по себе не ссылается на параметр типа, значение которого вам неизвестно).
Как говорили другие, единственный правильный ответ - нет, тип был удален.
Если в списке ненулевое количество элементов, вы можете исследовать тип первый элемент (например, используя метод getClass). Это не скажет вам общий тип списка, но было бы разумно предположить, что общий тип был неким суперклассом типов в списке.
Я бы не стал защищать этот подход, но в привязке его может быть полезно.
Тип удален, поэтому вы не сможете это сделать. См. http: //en.wikipedia. org / wiki / Type_erasure и http://en.wikipedia.org/wiki/Generics_in_Java#Type_erasure