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);
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");
}
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 que
char, byte, short, int, Character, Byte, Short, Integer, String, or an enum type
sinon, un heure de compilation Une erreur se produit.Selon la spécification, les éléments suivants doivent également être vrais:
- Chaque expression constante de cas associée à une instruction de commutateur Doit pouvoir être affectée au type de l'expression de commutateur.
- Aucune des expressions constantes
case
associées à une instruction switch Ne peut avoir la même valeur.- Aucune étiquette
switch
n'estnull
.- 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.
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
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!");
}
}
Comme le dit clairement l'erreur, les nombres ne sont pas des booléens.
Vous voulez true
et false
.
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 ? :
.
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
¯\_ (ツ) _/¯
switch (Boolean.hashCode(isOn)) {
case 1231: System.out.println("its on"); break;
case 1237: System.out.println("its off"); break;
}