我可以在Switch-Case的每个Case分支中声明具有相同名称的变量吗?

时间:2016-06-08 17:33:14

标签: java

我正在尝试在具有相同名称的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;
    }

4 个答案:

答案 0 :(得分:2)

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

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

当你混合几种没有任何共同点的类型时,你必须使用wildcard unknown type

答案 1 :(得分:1)

问题的标题应该是这样的: 我可以在每个Case分支 中声明具有相同名称的变量 无论如何......错误的原因是因为Switch-case中的CASE块与整个switch块共享相同的范围

答案 2 :(得分:1)

您可以在每个案例块内的代码周围放置花括号。 但是这使得变量只对case块本地化 - 你不能在休息后使用它。

因此,除非您只是在每个案例中使用它,否则请按@dabadaba说并将其放在开关之前。

答案 3 :(得分:0)

您的重复变量错误的原因是因为尽管您在不同的大小写块中声明了ex,但它在技术上仍然在同一范围内(即,粗略但简单的方式放置它是它们与在{ }的同一组中。换句话说,假设您从break移除了case 1;执行将落到case 2并尝试第二次声明变量。由于java编译器在评估此类事物时不考虑break,因此存在编译错误。

幸运的是,您可以事先使用通配符声明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.
    }