2011-03-22 1 views
1

У меня есть класс, MyObject<T> и список: List<MyObject<?>>.Java Generics в списке, как обрабатывать Список <MyClass<?>>

Содержание списка (пример):

  • MyObject<Date>();
  • MyObject<Integer>();

Тогда MyObject<T> класс содержит функцию:

public T getValue() { 
    return this.someAttribute; 
} 

Как я могу перебирать над моим Перечислить и вызвать метод getValue?

ответ

0

Попробуйте

for (MyObject obj : yourList){ 
    T value = obj.getValue(); 
} 
+1

У меня есть некоторые проблемы с этим - во-первых, вы используете сырой тип 'MyObject', который почти никогда не бывает хорош (возможно, должен был быть запрещен в компиляторах 1.5+), и вы должны предоставить * some * общий параметр , Во-вторых, где определяется параметр 'T'? Список имеет тип 'List >', поэтому нет предположения, что подходящий 'T' будет в области видимости. Наконец, вызов 'getValue()' будет ** не ** возвращать 'T', но либо возвратит' Object', либо '?' (В зависимости от того, адресуете ли вы вторую точку), поэтому это либо не скомпилируется, либо (правильно) поднять непроверенный бросок. –

1
for (myObject<?> obj : aList) { 
    obj.getValue(); 
} 
1
List<Myclass<?>> t = new ArrayList<Myclass<?>>(); 
    Iterator<Myclass<?>> iter = t.iterator(); 
    while (iter.hasNext()) { 
     Myclass<?> next = iter.next(); 
     Object value = next.getValue(); 
     System.out.println(value); 
    } 
+0

Дело в том, что результат элемента должен быть специфичным по типу. Это часть синтаксического анализа. – Jordi

+2

Как долго вы используете?, Вы не сможете получить конкретные результаты. Из того, что я понимаю из вашей проблемы, лучшее, что вы можете сделать, это использовать какую-то форму MyClass , а затем введите MyType как тип во время итерации. –

+1

@ Джорди, Сурай является правильным. До тех пор, пока у вас есть «Список >« Вы говорите », у меня есть список, содержащий« MyObject's of * some * type », но я не знаю, что это за тип». В этом случае нет способа * вы можете использовать определенный тип, потому что вы просто подразумеваете, что не знаете этого. Если вы ** знаете это (например, это «Двойной»), тогда объявите список «List >». Если тип изменяется для другого экземпляра класса, но идентичен внутри одного экземпляра, тогда вам будет нужна общая параметризация. –

0

Дело в том, результатом этого пункта должно быть типа специфичны. Это часть синтаксического анализа.

Результаты не могут быть конкретным типа, потому что ваш список содержит смесь parametized MyObject (Примечания что я использую верхний нотацию случая теперь ...). Результат будет типа Object, и вам нужно будет использовать instanceof и лить.

Пример кода:

public class MyObject<T> { 
    private T value; 
    public T getValue() {return value;} 

    // ... 
} 

Теперь мы составили список сниппет:

List<MyObject<?>> list = new ArrayList<MyObject<?>>(){ 
           new MyObject<Integer>(), new MyObject<String>()}; 
for (MyObject<?> item:list) { 
    Object itemValue = list.getValue(); 
} 

Из этого примера мы видим, что мы не можем бросить в любой другой тип, но Object - потому что коллекция содержит MyObject экземпляры, которые getValue() методов возвращают Integer или String.

0

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

for (MyObject<?> obj : aList) 
    call(obj); 

static <T> call(MyObject<T> obj) 
{ 
    T val = obj.getValue(); 
} 

Мы можем кормить MyObject<?> к call() методу в качестве MyObject<T> арг, из-за подстановочный захват.