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