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