Nie rozumiem błędu kompilatora wynikającego z następującego kodu. Definiuję ogólny interfejs, zobacz Zadanie, dwie metody: U doSomething(String value)
i List<Integer> getIDs()
. Metoda doSomething() używa generycznego typu jako typu zwracanej wartości, ale nie wydaje się powodować problemów. Metoda getIDs()
zwraca listę, która nie jest związana z typem zadania, ale powoduje problemy podczas używania dla instrukcji..acach do iterowania nad wartością zwracaną. Wystąpił następujący błąd kompilatora.Błąd kompilatora w ogólnym interfejsie języka Java z listą <> metoda
error: incompatible types for (Integer value : task.getIDs()){ required: Integer found: Object
Wydaje się, że wymazanie typ na interfejsie powoduje kompilator zapomnieć deklarowany typ na drugą metodą, która nie jest związana z typu rodzajowego. Innymi słowy, dlaczego typowy interfejs ma wpływ na to, jak kompilator rozumie wartość zwracaną w metodzie getIDs()
, a konkretnie w kontekście instrukcji for..each?
Najwyraźniej, jeśli mam odniesienie do listy poza ... dla .. nie ma problemu, ale nie bezpośrednio.
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();
}
Realizacja interfejsu nie jest konieczne wykazanie punkt, ale nie chciał opuścić odniesienie Task task = null;
i mieć odpowiedź mi mówi, że jest problem.
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);
}
}
Co robi to z 'return new int [] {1,2,3,4}' lub 'return Arrays.asList (new Integer (1), new Integer (2), ...);' ? (zauważ, nie hipotetycznie, spróbuj, dodaj wynik do pytania, aby pokazać, że boks/odpakowanie wyraźnie robi coś dziwnego) –
To jest bardzo dobre pytanie; odpowiedź jest prawdopodobnie ukryta głęboko w wnętrznościach JLS. – arshajii
@arshajii: Czy zmieniłeś 'U doSomething (wartość ciągu)' z 'U doSomething (wartość U)'? Wydaje mi się, że opublikowany kod faktycznie nie spełnia tego, co robi OP. –