A dokladniej, to musi byc rzutowalny (assignable) z typu T dla
Iterable<T> po ktorym sie iteruje.
Dawid
świetne podsumowanie! dzięki wielkie - postaram się następnym razem
dotrzeć, ale dzięki Tobie mogę być na bieżąco :)
pozdr. ad
Oczywiście konstrukcje if / while mogą zawierać przypisania inne niż
boolean, o ile całe wyrażenie będzie typu boolean, np.:
if ((a=5) > 0) { ... }
Tak moim skromnym zdaniem, egzamin skupia się za bardzo na poprawności
syntaktycznej - innymi słowy wcielamy się w kompilator, musząc zwracać
uwagę np. na to, czy nie zapomniano dwukropka za etykietą case. Mały
ma to związek z byciem "dobrym" programistom, czy nawet wydajnym
programistą (kompilator javac - w przeciwieństwie np. do g++ - sam
wyłapie nam każdy brakujący średnik). Wyobraża sobie ktoś wrzucić
niepoprawny składniowo kod do repozytorium? Imo egzamin powinien
skupiać się bardziej na błędach logicznych / wynikających z braku
znajomości dokumentacji.
Pozdrawiam
Artur
Mały wtręt ze światka .NET: javac nie wygeneruje ostrzeżenia w takiej sytuacji?
Ależ oczywiście, że wygeneruje... Wygeneruje "possible loss of
precision", wszak w kodzie występuje próba przypisania wartości "0.4",
która jest typu double na "węższy" typ float :-P
Pozdrawiam!
PS. no offfence - only kidding ;-)
--
yacoll
Optymiści wierzą, że świat stoi przed nimi otworem.
Pesymiści wiedzą, gdzie ma ten otwór.
Javac niestety nie, ale każde szanujące się IDE już tak.
Tutaj na szczęście z pomocą przychodzą takie narzędzie jak FindBugs:
http://findbugs.sourceforge.net/
> Mały wtręt ze światka .NET: javac nie wygeneruje ostrzeżenia w takiej sytuacji?Javac niestety nie, ale każde szanujące się IDE już tak.
to zależy... np. w Eclipse to jest domyślnie wyłączone, ale po włączeniu (opcja "Empty statement" dla ciekawskich), owszem...
private void doSth(File file) {
FileWriter writer;
try {
writer = new FileWriter(file);
/* some magic here */
} catch (IOException e) {
new RuntimeException(e);
} finally {
FileUtil.close(writer);
}
}
PS. Brat mnie uprzedził z FindBugsem gdy pisałem tego posta :)
Ośmielę się zapytać - co jest ciekawego w tym przykładzie, poza tym,
że się on nie skompiluje? (w finally używana jest zmienna writer,
która może być niezainicjalizowana - wykryje to kompilator, nie
potrzeba FindBugs)
Braciszku, załóżmy że poprawiłeś błąd kompilacji. Mała podpowiedź,
spójrz na blok catch {...} Finbugs jednak się przyda w tym przypadku,
bo jak widać kompilator i Ty nie zauważaliście pomyłki ;)
Napotkawszy błąd kompilacji, zaniechałem dalszej analizy ;-)
Niestety te pytania SUNa mają podobny charakter -- często jest zasłona
dymna, a błąd kryje się w innym miejscu. Ja zresztą nie neguję tego,
że dużo błędów da się wyłapać automatycznie (findbugs, czy jdt); po
prostu nie wszystkie się da, a czasem głupi błąd jest najtrudniejszy
do znalezienia.
Dawid
P.S. Do Leszka: .NET, a w zasadzie C# ma nowszą specyfikację i parę
rzeczy napisanych zostało dużo lepiej. Między innymi compound
assignments typu +=, -= itd. są dużo ładniejsze i lepiej zdefiniowane.
Java ciągnie się długo i wiele rzeczy narosło lub zostało nałożonych
na kompilator (klasy wewnętrzne, syntetyczne accesory) lub jako nieco
koślawe rozszerzenie (erasure w generykach).