wtorek, 16 lutego 2021

Zadanie z analizy kodu

 Na dzisiaj mam krótką zagadkę związaną z poniższym kodem. Co się wyświetli?

public class Exploit {
public static void main(String[] args) {
Elementary elementary = new Elementary(1);
}
}

class Elementary {
double value;

public Elementary(int seed) {
this(seed == 1 ? (float) seed : (double) seed);
}

public Elementary(float floatSeed) {
this.value = floatSeed;
System.out.println("You passed");
}

public Elementary(double doubleSeed) {
this.value = doubleSeed;
System.out.println("You failed");
}
}


No właśnie, w metodzie main wołamy nasz obiekt Elementary i jego konstruktor. W konstruktorze dokonuję banalnego testu, którego wynikiem będzie true, po to, aby castować wartość seed na float i wywołać floatowy konstruktor.
Niestety nic z tego. Zgodnie z bardzo rozbudowaną sekcją specyfikacji Javy (15.25) ternary operator zachowuje się tutaj dość niespodziewanie: jeżeli jedna z opcji jest typu double, to druga też będzie tak castowana. Działa to także dla innych typów, ale szczerze mówiąc na razie jest to dla mnie dość hermetyczne.
Kto zna speckę Javy na pamięć, ten zdał ;)

Brak komentarzy:

Prześlij komentarz

Server socket all over place

 Kilka godzin tutoriali YT później i różnych prób, w końcu udało się zachęcić Server do współpracy :) Nie mogę powiedzieć, że to przełom, bo...