Определение типа записей списка

У меня есть список Список в Java. Есть ли способ определить тип содержимого этого списка во время выполнения, когда список пуст?

1
задан tobiasbayer 25 August 2010 в 14:01
поделиться

5 ответов

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

Допустим, прямо сейчас ваш List Содержит 2 элемента: Double и Integer ... было бы нетривиально выяснить, что это может быть List ... и даже тогда он может действительно быть List , и кто-то может добавить String позже.

Более того, допустим, это действительно List >. Самое большее, что вы поймете, не пытаясь выполнить рекурсию, - это то, что это List >.

Есть и светлая сторона. В зависимости от вашей ситуации вы можете использовать Type Tokens для обхода стирания безопасным способом. Вот отличный пост: http://gafter.blogspot.com/2006/12/super-type-tokens.html

2
ответ дан 2 September 2019 в 21:51
поделиться

Предполагая, что в списке есть хотя бы один объект, чтобы получить тип списка - list.get (0) .getClass (). GetSuperclass.getName ();

Чтобы получить тип отдельного объекта - list.get (0) .getClass (). GetName ();

0
ответ дан 2 September 2019 в 21:51
поделиться

Как говорит Чии, вы можете перебирать каждый элемент. Кроме этого, вы не можете этого знать, потому что технически вы можете поместить любой объект в Список.

Например,

    List list = new ArrayList();
    list.add(new Integer(1));
    list.add(new Integer(2));
    list.add("string");
    list.add(new Double(0.2));

Каким будет тип списка в приведенном выше примере? На этот вопрос нет ответа.

0
ответ дан 2 September 2019 в 21:51
поделиться

Если список не пуст, то 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

0
ответ дан 2 September 2019 в 21:51
поделиться

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

Например,

for (Object o : list) {
   if (o.getClass().equals(MyClass.class)) {
      MyClass myClass = (MyClass) o;
      //do something with myClass etc etc
   }
   //...more if statements?
}
0
ответ дан 2 September 2019 в 21:51
поделиться
Другие вопросы по тегам:

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