14

为什么我的编译器告诉我:

不兼容的类型:

必需:布尔值

发现:整数

在案例 0 和案例 1 下


例如:

    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!");
    }

}

司机等级:

Club me = new Club();
me.test(true);
4

10 回答 10

20

您正在打开boolean类型,并且您的案例正在使用int类型。但是,即使您将案例更改为具有boolean类型,那也行不通。您无法打开boolean类型。这没有任何意义,因为if-else无论如何使用 an 会更容易:

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

请注意,这里没有"I don't know!"案例。一个boolean类型可以有一个true或一个false值。这是另一个原因,为什么switch-case不是boolean类型。没有默认情况。

您还可以使用条件表达式将其压缩为单个语句:

public void test(boolean isOn) {
    System.out.println(isOn ? "its on" : "its off");
}
于 2013-10-13T22:52:23.537 回答
5

只需将布尔值转换为 1 和 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!");
    }
}
于 2017-07-07T12:31:36.767 回答
4

switch (isOn):切换boolean并想用int例如case 0

根据JLS 第 14.11 节:对于 switch ( Expression ) SwitchBlock

表达式只能在char, byte, short, int, Character, Byte, Short, Integer, String, or an enum type其他方面发生编译时错误

根据规范,以下内容也必须为真:

  1. 与 switch 语句关联的每个 case 常量表达式都必须可分配给 switch 表达式的类型。
  2. case与 switch 语句关联的任何两个常量表达式都不能具有相同的值。
  3. 没有switch标签是null
  4. 同一个 switch 语句最多可以关联一个默认标签

因此,switch 表达式不能是 float、double 或boolean. 回答为什么?:布尔值true false在使用 with 时是有意义的if-else,例如if(true) then do. 浮点数 ( float, double) 不是 switch 的好候选,因为精确比较经常被舍入错误破坏。例如0.11 - 0.1 == 0.01是假的。

于 2013-10-13T22:53:30.547 回答
3

¯\_(ツ)_/¯

switch (Boolean.hashCode(isOn)) {
    case 1231: System.out.println("its on"); break;
    case 1237: System.out.println("its off"); break;
}
于 2018-05-17T10:14:12.843 回答
3

在 Java 中,Switch 不适用于布尔值。

接受的变量类型有:char,byte,short,int,String,Character,Byte,Short,Integer,enum

于 2017-11-17T10:29:39.663 回答
2

正如错误明确指出的那样,数字不是布尔值。

你想要truefalse

于 2013-10-13T22:51:40.330 回答
0

这不是 C++,其中 1 和 0 隐式转换为真假。即使你能做到,开启 boolean 也是浪费时间;只需编写一个简单的 if/else 语句,或使用? :构造。

于 2013-10-14T03:00:39.170 回答
0

您不能在 switch 语句上使用布尔值。当语句为真或假时,使用 switch 是没有意义的。if-else 很容易使用。

于 2020-11-04T23:51:23.963 回答
0

如果您可以使用表达式进行案例检查而不是 if else 树或继续循环(也许我错了,这是一个好处),那么带有布尔值的 Imho 切换将是有意义的,例如:

class Testomatoe
{
    private final String country;
    private final String sort;
    private final int pricePerKiloEUCent;
    
    public Testomtoe
    (   final String country,
        final String sort,
        final int pricePerKiloEUCent
    )
    {
        this.country = country;
        this.sort = sort;
        this.pricePerKiloEUCent = pricePerKiloEUCent;
    }
    
    //get...
}


List<Testomataoe> offers = ...
String country;
String sort
int price;

for( Testomatoe tom : offers )
{
    country = tom.getCountry();
    sort = tom.getSort();
    price = tom.getPricePerKiloEUCent();
    
    switch( true )
    {
        case price < 100:
            addToQueryQuality( tom );
            break;

        case isUrgent( sort ) && price < 300:
            adddToPriOrder( tom );
            break;

        case !country.equals( "Somewheria" ) && price <= 200:
            addToOrder( tom );
            break;

        case country.equals( "Island" ) && sort.equals( "BlueFrost" ) && price < 600:
            addToAcceptable( tom );
            break;
        ...
    }
}
于 2022-02-18T09:08:56.110 回答
0

在 Java 中,switch 仅适用于整数文字以及那些可能提升为整数文字(例如 char)的文字。

此外,在 Java 中,布尔类型只有两个值,真或假。这与 C/C++ 中的情况不同,其中 true 是任何不等于零的值,而 false 是零。

此外,您的代码有点多余

于 2019-01-27T13:18:30.343 回答