У меня есть List<?> list
в Java. Есть ли способ определить тип содержимого этого списка во время выполнения, когда список пуст?Определение типа записей в списках
ответ
К сожалению, вы не можете определить тип из-за стирание - на самом деле, даже если список не пуст, то до сих пор не могут надежно определить, что представляет собой список.
Скажем, прямо сейчас ваш список <? > содержит 2 элемента: двойное и целое ... было бы нетривиально выяснить, что это может быть список < Номер > ... и даже тогда это действительно может быть список < Объект >, и кто-то может добавить Строка позже.
Кроме того, допустим, что это действительно список < Список < Строка > >. Самое большее, что вы выясните, не пытаясь повторить, это список < <? > >.
Существует яркая сторона. В зависимости от вашей ситуации вы можете использовать Type Tokens, чтобы работать со стиранием по типу. Там отличная статья: http://gafter.blogspot.com/2006/12/super-type-tokens.html
Предполагая, что есть по крайней мере один объект в списке, чтобы получить тип списка - list.get(0).getClass().getSuperclass.getName();
Чтобы получить тип отдельного объекта - list.get(0).getClass().getName();
В зависимости от того, что действительно требуется, 'getClass()', может не работать. ''
@polygenelubricants - true, update ... – froadie
Я хотел был бы иметь возможность сделать это в пустом списке. Вопрос отредактирован. – tobiasbayer
Да, есть. Вы можете перебирать каждый объект в списке и вызывать метод .getClass() и распечатывать его имя класса (или делать разные вещи в зависимости от класса).
например,
for (Object o : list) {
if (o.getClass().equals(MyClass.class)) {
MyClass myClass = (MyClass) o;
//do something with myClass etc etc
}
//...more if statements?
}
Я хотел бы иметь возможность сделать это в пустом списке. Вопрос отредактирован. – tobiasbayer
стирание типа не позволит вам получить информацию, которую вы хотите получить во время выполнения. – Chii
Как говорит чий, вы можете перемещаться по каждому элементу. Кроме этого, вы не можете знать, потому что технически вы можете поставить любой объект в List
.
например,
List list = new ArrayList();
list.add(new Integer(1));
list.add(new Integer(2));
list.add("string");
list.add(new Double(0.2));
В приведенном выше примере, что бы тип list
быть? На этот вопрос нет ответа.
o alquimista: 'tob' запрашивает дженерики. В соответствии с дженериками: как только вы упомянули, что список может содержать экземпляр x, тогда ваш список не может иметь экземпляр y –
@Rakesh: он _can_, если вы игнорируете предупреждения, используете необработанные типы/непроверенное преобразование и т. Д. Именно поэтому вы должны 't, но вы можете, если вы действительно хотите или случайно. – polygenelubricants
Если список не пуст, то froadie
правильно , но если список пуст, то в соответствии с Type erasure
невозможно найти тип объекта списка может иметь.
В 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
- 1. Python Определение списков в списках
- 2. Соответствие конкретных записей в списках
- 3. Определение функции Python в двух списках
- 4. Определение типа анонимного типа
- 5. Получение определенных записей в вложенных списках
- 6. R: вызывающая функция в нескольких списках записей
- 7. Определение типа
- 8. Определение типа в .NET
- 9. определение типа в скобках
- 10. Определение типа типа для prom.prototype.finally
- 11. Преобразование неявного типа C++ в списках аргументов
- 12. Определение типа типа для prom.reject
- 13. Rails: определение типа модели в коллекции присоединился
- 14. Определение типа возвращаемого типа динамического типа
- 15. Определение типа, используемого в HashMap
- 16. Определение типа в шаблоне функции
- 17. Рекурсивный определение типа в Scala
- 18. Скрыть определение типа в C
- 19. Определение типа инструкции в PDO
- 20. Определение типа C++ в C#
- 21. Определение типа файла в C
- 22. Определение типа объекта в JavaScript
- 23. Определение типа управления в Request.Form
- 24. Определение типа объекта в рубин
- 25. Определение типа данных в Haskell
- 26. Определение типа переменной в Fortran
- 27. Определение типа cast в Java
- 28. Определение типа данных в RapidMiner
- 29. Определение типа исключения в обработчике
- 30. определение типа браузера в css
Посмотрите на стирание стилей в Java: http://download.oracle.com/javase/tutorial/java/generics/erasure.html – wheaties
Так что я предполагаю, что ответ «нет». – tobiasbayer
@tob: Расскажите подробнее о том, что вы пытаетесь сделать. Предположим, вы можете получить параметр типа. Что тогда? – polygenelubricants