【发布时间】:2022-10-17 12:58:41
【问题描述】:
我正在通过Oracle官方docs了解模式变量范围在 Java 17 中。在以下示例中,方法 testScope1 的工作原理与文档中的说明相同,但方法 testScope2 给出了编译错误。我无法弄清楚为什么 void 方法的返回类型会导致问题?
interface Vehicle{}
class Car implements Vehicle{}
class Pattern{
public int testScope1(Vehicle v){
if(!(v instanceof Car c)){
return 1;
}
System.out.println(c.toString()); //WORKS FINE
return 2;
}
public void testScope2(Vehicle v){
if(!(v instanceof Car c)){
}
System.out.println(c.toString()); //COMPILE TIME ERROR: Cannot resolve symbol c
}
}
【问题讨论】:
-
“模式变量的范围是程序只有在 instanceof 运算符为真时才能到达的地方:”
-
显然返回类型不是原因——它是返回语句。
-
我也对此感到困惑。没有调查,给出的答案对我来说都不是很满意。无论运行时的值如何,变量的范围对我来说都是模糊的。由于 c 在 if 表达式中被引入,我希望它的范围涵盖表达式以及
then和else代码块,但仅此而已。这样一来,我已经很惊讶地看到第一种方法很好。然而我读到“模式变量的范围可以超出引入它的语句”
标签: java instanceof java-17