Un petit puzzler Java pour se détendre ?.

Considérons le programme Java suivant :

public class TernaryPuzzler1 {
    public static void main(String[] args) {
        System.out.println(getBase(true) instanceof Sub1);
        System.out.println(getBase(true));
    }

    private static Base getBase(boolean condition) {
        Base result = condition ? new Sub1() : new Sub2();
        return result;
    }
}

class Base {
}

class Sub1 extends Base {
    @Override
    public String toString() {
        return "Sub1";
    }
}

class Sub2 extends Base {
    @Override
    public String toString() {
        return "Sub2";
    }
}

Que se passe-t-il lorsqu’on l’exécute? Ne vous inquiétez pas, il n’y a pas de piège. Oui, la condition est vraie, donc une instance de Sub1 est retournée, et les lignes suivantes s’affichent donc à l’écran :

true
Sub1

Maintenant appliquons le même code aux classes Number, Long et Double:

public class TernaryPuzzler2 {
    public static void main(String[] args) {
        System.out.println(getNumber(true) instanceof Long);
        System.out.println(getNumber(true));
    }

    private static Number getNumber(boolean condition) {
        Number result = condition ? new Long(10L) : new Double(20.0);
        return result;
    }
}

Que se passe-t-il lorsqu’on l’exécute? Attention, là, il y a un piège. Cliquez ici pour afficher la réponse.

Si vous voulez comprendre pourquoi, lisez donc la réponse à cette question sur StackOverflow, qui a inspiré ce post.