2016-06-08 85 views
0

我想创建一个具有相同名称的开关情况下的泛型类对象我得到一个重复变量的错误。有没有办法在不改变对象名称的情况下创建对象。我可以在Switch-Case的每个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; 
    } 
+0

什么是你的代码的其他人呢? –

+0

之后你做了什么? –

+0

在开关块之外声明它。 “内部”案件的范围是共享的。 – dabadaba

回答

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

至于有没有共同点你混合几种类型,你必须使用wildcardunknown type

1

问题的标题应该是这样的: 我可以声明具有相同名称的变量,在任何情况下分支 反正...错误的原因是因为CASE块Switch-case与整个交换机块的共享范围相同

+0

但在这种开关情况下,我正在初始化对象不只是宣布它们。 –

+0

是的,但在java中这与在同一范围内多次声明它相同 –

1

您可以在每个大小写块内的代码周围放置大括号。 但是,这使变量本地只有大小写块 - 你不能在休息后使用它。

所以,除非你只打算在每种情况下使用它,否则按@dabadaba的说法,并将其放在开关之前。

0

重复出现变量错误的原因是因为尽管事实上你在不同的大小写块中声明ex,但它在技术上仍然在相同的范围内(例如,一个粗略但简单的方法是将它们放在相同的范围内一套{ })。换句话说,假设你从case 1中删除了break;执行会落到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. 
    } 
相关问题