У меня есть список Список >
в Java.
Есть ли способ определить тип содержимого этого списка во время выполнения, когда список пуст?
К сожалению, вы не можете определить тип из-за стирания - на самом деле, даже если список не пуст, вы все равно не можете надежно определить, что это за список на самом деле.
Допустим, прямо сейчас ваш List > Содержит 2 элемента: Double и Integer ... было бы нетривиально выяснить, что это может быть List
Более того, допустим, это действительно List >. Самое большее, что вы поймете, не пытаясь выполнить рекурсию, - это то, что это List
>.
Есть и светлая сторона. В зависимости от вашей ситуации вы можете использовать Type Tokens для обхода стирания безопасным способом. Вот отличный пост: http://gafter.blogspot.com/2006/12/super-type-tokens.html
Предполагая, что в списке есть хотя бы один объект, чтобы получить тип списка - list.get (0) .getClass (). GetSuperclass.getName ();
Чтобы получить тип отдельного объекта - list.get (0) .getClass (). GetName ();
Как говорит Чии, вы можете перебирать каждый элемент. Кроме этого, вы не можете этого знать, потому что технически вы можете поместить любой объект в Список
.
Например,
List list = new ArrayList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add("string");
list.add(new Double(0.2));
Каким будет тип списка
в приведенном выше примере? На этот вопрос нет ответа.
Если список не пуст, то froadie
правильный
но если список пуст, то согласно типу стирания
невозможно найти тип объекта, который может иметь список.
В Java,
ArrayList<Integer> li = new ArrayList<Integer>();
ArrayList<Float> lf = new ArrayList<Float>();
if (li.getClass() == lf.getClass()) // evaluates to true
System.out.println("Equal");
Источник: http://en.wikipedia.org/wiki/Generics_in_Java#Type_erasure
Да, есть. Вы можете перебирать каждый объект в списке, вызывать метод .getClass() и распечатывать его имя класса (или выполнять различные действия в зависимости от класса).
Например,
for (Object o : list) {
if (o.getClass().equals(MyClass.class)) {
MyClass myClass = (MyClass) o;
//do something with myClass etc etc
}
//...more if statements?
}