Zagadki Java zawierają różnego rodzaju niuanse języka i „podchwytliwe” fragmenty kodu. Każda następna zagadka będzie zawierała odpowiedź i wyjaśnienie do poprzedniej. Lista wszystkich zagadek.
Jeżeli znasz odpowiedź, podziel się nią w komentarzu!
Zagadka Java #10¶
Czy klasa ToTakeUmbrellaOrNot skompiluje się bez błędów? Jeżeli tak, to co zobaczymy na ekranie w wyniku jej uruchomienia?
public interface ToBeOrNotToBe { default void question() { System.out.println("To be or not to be."); } }
public interface IsItRaining { void question(); }
public class ToTakeUmbrellaOrNot implements ToBeOrNotToBe, IsItRaining { public static void main(String[] args) { new ToTakeUmbrellaOrNot().question(); } }
Odpowiedź do poprzedniej zagadki #9¶
Poniżej znajdziesz odpowiedź do poprzedniej zagadki.
Pierwsza z klas korzystających z trój-argumentowego operatora logicznego nie skompiluje się z powodu następującego błędu:
Kompilator protestuje, ponieważ, w zależności od wyniku warunku d > 0.5, trój-argumentowy operator logiczny zwróciłby wartość 1, którą możemy przypisać do zmiennej x typu int, lub "prawda", która, będąc wartością typu String, nie może zostać przypisana do zmiennej x.
Co jednak w przypadku dwóch pozostałych klas? Obie skompilują i wykonają się bez błędów. Na ekranie zobaczymy w obu przypadkach albo 0, albo prawda, w zależności od wylosowanej za pomocą metody Math.random wartości. Dlaczego w tych dwóch przypadkach kod się kompiluje?
W przypadku klasy TernaryOperator2, zamiast podać typ zmiennej x, korzystamy z funkcjonalności dodanej do języka Java w wersji 10. Słowo kluczowe var powoduje, że pozostawiamy kompilatorowi określenie typu, jaki ma mieć zmienna lokalna x, na podstawie wartości wyrażenia, które do niej przypisujemy. To, że w tym przypadku to wyrażenie zwraca wartości różnych typów, nie stanowi dla kompilatora problemu.
W klasie TernaryOperator3 bezpośrednio wyświetlamy wynik wyrażenia korzystającego z trój-argumentowego operatora logicznego na ekran, bez przypisywania go do zmiennej pomocniczej. Metoda System.out.println może wyświetlić wartość dowolnego typu. Ponownie, zwracanie z wyrażenia wartości różnych typów (albo int, albo String) nie stanowi tutaj problemu.