Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以在开关案例的每个案例分支中声明具有相同名称的变量吗?_Java - Fatal编程技术网

Java 我可以在开关案例的每个案例分支中声明具有相同名称的变量吗?

Java 我可以在开关案例的每个案例分支中声明具有相同名称的变量吗?,java,Java,我试图在switch case中创建一个具有相同名称的泛型类对象。我得到了一个重复变量的错误。是否有一种方法可以在不更改对象名称的情况下创建对象 switch (ch) { case 1: Example<Integer> ex = new Example<Integer>(); break; case 2: Example<Float> ex = new Example<Float>

我试图在switch case中创建一个具有相同名称的泛型类对象。我得到了一个重复变量的错误。是否有一种方法可以在不更改对象名称的情况下创建对象

switch (ch) {
    case 1:
        Example<Integer> ex = new Example<Integer>();
        break;
    case 2:
        Example<Float> ex = new Example<Float>();
        break;
    case 3:
        Example<String> ex = new Example<String>();
        break;
    default:
        System.out.println("");
        break;
    }
开关(ch){
案例1:
Example ex=新示例();
打破
案例2:
Example ex=新示例();
打破
案例3:
Example ex=新示例();
打破
违约:
System.out.println(“”);
打破
}

问题的标题应类似于: 我可以在每一个分支中声明名称相同的变量吗
无论如何……错误的原因是开关盒中的案例块与整个开关块共享相同的范围。问题的标题应类似于: 我可以在每一个分支中声明名称相同的变量吗
无论如何…错误的原因是因为开关盒中的CASE块与整个开关块共享相同的范围

您可以在每个CASE块中的代码周围放上花括号。 但是这使得变量只对case块是局部的-你不能在中断后使用它


因此,除非您只打算在每个case中使用它,否则请按照@dabadaba所说的操作,并将其放置在开关之前。

您可以在每个case块中的代码周围放置大括号。 但是这使得变量只对case块是局部的-你不能在中断后使用它


因此,除非您只打算在每个案例中使用它,否则请按照@dabadaba所说的操作并将其放置在开关之前。

您需要将变量声明移到开关块之外,如下所示:

Example<?> ex;
switch (ch) {
    case 1:
        ex = new Example<Integer>();
        break;
    case 2:
        ex = new Example<Float>();
        break;
    case 3:
        ex = new Example<String>();
        break;
    default:
        throw new IllegalArgumentException("Unknown type " + ch);
}
示例ex;
开关(ch){
案例1:
ex=新示例();
打破
案例2:
ex=新示例();
打破
案例3:
ex=新示例();
打破
违约:
抛出新的IllegalArgumentException(“未知类型”+ch);
}

当您混合了几种没有共同点的类型时,您必须为
未知类型使用
通配符

您需要将变量声明移到开关块之外,如下所示:

Example<?> ex;
switch (ch) {
    case 1:
        ex = new Example<Integer>();
        break;
    case 2:
        ex = new Example<Float>();
        break;
    case 3:
        ex = new Example<String>();
        break;
    default:
        throw new IllegalArgumentException("Unknown type " + ch);
}
示例ex;
开关(ch){
案例1:
ex=新示例();
打破
案例2:
ex=新示例();
打破
案例3:
ex=新示例();
打破
违约:
抛出新的IllegalArgumentException(“未知类型”+ch);
}

当您混合了几种没有共同点的类型时,您必须对
未知类型使用
通配符

重复变量错误的原因是,尽管您在不同的case块中声明了
ex
,但在技术上它仍然在同一范围内(也就是说,一个粗略但简单的说法是,它们位于同一组
{}
)。换句话说,假设您将
中断
案例1
中删除;执行将进入
案例2
,并尝试第二次声明变量。由于java编译器在计算此类内容时未将
中断
考虑在内,因此存在编译错误

幸运的是,您可以事先使用通配符声明
ex
,然后再为其赋值:

Example<?> ex = null;
switch (ch) {
    case 1:
        ex = new Example<Integer>();
        break;
    case 2:
        ex = new Example<Float>();
        break;
    case 3:
        ex = new Example<String>();
        break;
    default:
        System.out.println(""); //You may want to do something more dramatic here, if this is an error case.
        break; //Redundant, since execution path falls out of this scope right after this anyway.
    }
示例ex=null;
开关(ch){
案例1:
ex=新示例();
打破
案例2:
ex=新示例();
打破
案例3:
ex=新示例();
打破
违约:
System.out.println(“”;//如果这是一个错误案例,您可能希望在这里做一些更引人注目的事情。
break;//冗余,因为执行路径在此之后就不在此范围内了。
}

重复变量错误的原因是,尽管您在不同的case块中声明了
ex
,但从技术上讲,它仍然在相同的范围内(即粗略但简单的说法是,它们在同一组
{}
中)。换句话说,假设您将
中断
案例1
中删除;执行将进入
案例2
,并尝试第二次声明变量。由于java编译器在计算此类内容时未将
中断
考虑在内,因此存在编译错误

幸运的是,您可以事先使用通配符声明
ex
,然后再为其赋值:

Example<?> ex = null;
switch (ch) {
    case 1:
        ex = new Example<Integer>();
        break;
    case 2:
        ex = new Example<Float>();
        break;
    case 3:
        ex = new Example<String>();
        break;
    default:
        System.out.println(""); //You may want to do something more dramatic here, if this is an error case.
        break; //Redundant, since execution path falls out of this scope right after this anyway.
    }
示例ex=null;
开关(ch){
案例1:
ex=新示例();
打破
案例2:
ex=新示例();
打破
案例3:
ex=新示例();
打破
违约:
System.out.println(“”;//如果这是一个错误案例,您可能希望在这里做一些更引人注目的事情。
break;//冗余,因为执行路径在此之后就不在此范围内了。
}

您的代码的其余部分是什么?之后您要做什么?在开关块外声明它。“内部”范围是共享的。对象没有名称。变量有名称。您以后打算如何处理这样的变量?代码的其余部分是什么?之后您要做什么?在开关块外声明它。“内部”范围案例是共享的。一个对象没有名称。一个变量有名称。您以后打算如何处理这样一个变量?但是在这个切换案例中,我初始化对象的时候不只是声明它们。是的,但在java中,这与在同一个范围中多次声明相同,但在这个切换案例中,我初始化对象的时候不只是声明它们。yes,但在java中,这与在同一范围内多次声明相同