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