Я не понимаю ошибку компилятора, вытекающую из следующего кода. Я определяю общий интерфейс, см. "Задача", с двумя способами: U doSomething(String value)
и List<Integer> getIDs()
. Метод doSomething() фактически использует тип generic как тип возвращаемого значения, но, похоже, не вызывает проблем. Метод getIDs()
возвращает список, который не связан с типом задачи, но он вызывает проблемы при использовании for.each для итерации по возвращаемому значению. Произошла следующая ошибка компилятора.
error: incompatible types for (Integer value : task.getIDs()){ required: Integer found: Object
Кажется, что стирание типа на интерфейсе заставляет компилятор забыть объявленный тип во втором методе, который не имеет отношения к родовому типу. Или, другими словами, почему общий тип интерфейса влияет на то, как компилятор понимает возвращаемое значение в методе getIDs()
и, в частности, в контексте выражения for..each?
По-видимому, если я получаю ссылку на список за пределами for..each, нет проблем, но не напрямую.
public class InterfaceTest {
public static void main(String[] args) {
Task task = new MyTask();
// no complaints about the type here
List<Integer> values = task.getIDs();
// getting a compiler error for this line
for (Integer value : task.getIDs()){
}
}
}
interface Task<U>{
U doSomething(String value);
List<Integer> getIDs();
}
Реализация интерфейса не требуется для демонстрации точки, но я не хочу оставлять ссылку Task task = null;
и иметь ответ, говорящий мне, что проблема.
class MyTask implements Task<Boolean>{
@Override
public Boolean doSomething(String value) {
System.out.println(value);
return false;
}
@Override
public List<Integer> getIDs() {
return Arrays.asList( 1, 2, 3, 4 );
}
}