Zagadka Java #10

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:

TernaryOperator1.java:5: error: incompatible types: bad type in conditional expression int x = d > 0.5 ? 1 : "prawda"; ^ String cannot be converted to int 1 error

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Nie musisz podawać swojego imienia, e-mailu, ani strony www, aby opublikować komentarz. Komentarze muszą zostać zatwierdzone, aby były widoczne na stronie.