2010-08-25 5 views
1

У меня есть List<?> list в Java. Есть ли способ определить тип содержимого этого списка во время выполнения, когда список пуст?Определение типа записей в списках

+2

Посмотрите на стирание стилей в Java: http://download.oracle.com/javase/tutorial/java/generics/erasure.html – wheaties

+0

Так что я предполагаю, что ответ «нет». – tobiasbayer

+0

@tob: Расскажите подробнее о том, что вы пытаетесь сделать. Предположим, вы можете получить параметр типа. Что тогда? – polygenelubricants

ответ

2

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

Скажем, прямо сейчас ваш список <? > содержит 2 элемента: двойное и целое ... было бы нетривиально выяснить, что это может быть список < Номер > ... и даже тогда это действительно может быть список < Объект >, и кто-то может добавить Строка позже.

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

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

0

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

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

+2

В зависимости от того, что действительно требуется, 'getClass()', может не работать. '' '' может содержать 'Собака', но это не' Список '. – polygenelubricants

+0

@polygenelubricants - true, update ... – froadie

+0

Я хотел был бы иметь возможность сделать это в пустом списке. Вопрос отредактирован. – tobiasbayer

0

Да, есть. Вы можете перебирать каждый объект в списке и вызывать метод .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

Я хотел бы иметь возможность сделать это в пустом списке. Вопрос отредактирован. – tobiasbayer

+0

стирание типа не позволит вам получить информацию, которую вы хотите получить во время выполнения. – Chii

0

Как говорит чий, вы можете перемещаться по каждому элементу. Кроме этого, вы не можете знать, потому что технически вы можете поставить любой объект в 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 быть? На этот вопрос нет ответа.

+0

o alquimista: 'tob' запрашивает дженерики. В соответствии с дженериками: как только вы упомянули, что список может содержать экземпляр x, тогда ваш список не может иметь экземпляр y –

+0

@Rakesh: он _can_, если вы игнорируете предупреждения, используете необработанные типы/непроверенное преобразование и т. Д. Именно поэтому вы должны 't, но вы можете, если вы действительно хотите или случайно. – polygenelubricants

0

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

Смежные вопросы