web-dev-qa-db-fra.com

L'instruction Switch avec boolean ne fonctionne pas?

Pourquoi mon compilateur me dit-il:

Personne imcompatible:

Champs obligatoires: Booléen

A trouvé: Int

dans les cas 0 et 1


Par exemple:

    public void test(boolean isOn){
    switch (isOn){
        case 0:
            if (isOn){
                System.out.println("its on");
            }
            break;
        case 1:
            if (!isOn){
                System.out.println("its off");
            }
            break;
        default:
            System.out.println("I don't know!");
    }

}

Classe de conducteur:

Club me = new Club();
me.test(true);
8
user2708074

Vous basculez sur le type boolean et vos cas utilisent des types int. Mais même si vous modifiez vos cas pour avoir des types boolean, cela ne fonctionnera pas. Vous ne pouvez pas activer le type boolean. Et cela n'aurait aucun sens, utiliser un if-else serait de toute façon plus facile:

if (isOn) {
    System.out.println("its on");
} else {
    System.out.println("its off");
}

Notez qu'il n'y a pas de cas "I don't know!" ici. Un type boolean peut avoir la valeur true ou false. Ceci est une autre raison pour laquelle switch-case n'est pas pour le type boolean. Il n'y a pas de cas par défaut.

Vous pouvez également le condenser en une seule instruction en utilisant un expression conditionnelle :

public void test(boolean isOn) {
    System.out.println(isOn ? "its on" : "its off");
}
15
Rohit Jain

switch (isOn): permuter boolean et vouloir mettre en casse int par exemple, case 0

Selon le JLS section 14.11 : pour un switch ( Expression ) SwitchBlock

L'expression ne peut être quechar, byte, short, int, Character, Byte, Short, Integer, String, or an enum typesinon, un heure de compilation Une erreur se produit. 

Selon la spécification, les éléments suivants doivent également être vrais:

  1. Chaque expression constante de cas associée à une instruction de commutateur Doit pouvoir être affectée au type de l'expression de commutateur.
  2. Aucune des expressions constantes case associées à une instruction switch Ne peut avoir la même valeur.
  3. Aucune étiquette switch n'est null.
  4. Au plus une étiquette par défaut peut être associée à la même instruction switch

Par conséquent, l'expression de commutateur ne peut pas être float, double ou boolean. POUR répondre à la question pourquoi?: Les booléens true false ont un sens en utilisant avec if-else, par exemple, if(true) then do. Les nombres en virgule flottante (float, double) ne sont pas de bons candidats au changement, car la comparaison exacte est souvent interrompue par des erreurs d'arrondi. par exemple. 0.11 - 0.1 == 0.01 est faux.

3
Sage

En Java, Switch ne fonctionne PAS avec Boolean.

Les types de variables acceptés sont: Char, octet, short, int, String, Caractère, Octet, Short, Integer, enum

2
Gagan Mani

Il suffit de convertir le booléen en nombre de 1 et 0.

public void test(boolean isOn){
    int trueOrFalse;
    if(isOn == true){
      trueOrFalse = 1;
    }else{
      trueOrFalse = 0;
    }
    switch (trueOrFalse){
        case 1:
            if (isOn){
                System.out.println("its on");
            }
            break;
        case 0:
            if (!isOn){
                System.out.println("its off");
            }
            break;
        default:
            System.out.println("I don't know!");
    }
}
1
Tubig

Comme le dit clairement l'erreur, les nombres ne sont pas des booléens.

Vous voulez true et false.

1
SLaks

Ce n'est pas C++ où 1 et 0 sont implicitement convertis en vrai et faux. Activer un booléen est aussi une perte de temps, même si vous pouviez le faire. écrivez simplement une simple instruction if/else ou utilisez la construction ? :.

0
Gigatron

En Java, switch ne fonctionne qu'avec les littéraux entiers et ceux qui pourraient éventuellement être promus en littéraux entiers tels que char.

De plus, en Java, le type booléen n'a que deux valeurs, true ou false. Ceci est différent de la situation en C/C++ où true est une valeur non égale à zéro et false à zéro. 

De plus votre code est un peu redondant

0
Abhishek Ghosh

¯\_ (ツ) _/¯

switch (Boolean.hashCode(isOn)) {
    case 1231: System.out.println("its on"); break;
    case 1237: System.out.println("its off"); break;
}
0
ZhekaKozlov