public class InstanceofTest {
public static void process1(Object o){
if(!(o instanceof String)){
return ;
}
System.out.println(((String) o).length());
}
public static void process2(Object o){
if(!(o instanceof String s)){
System.out.println(s); //编译错误:Cannot resolve symbol 's'
return;
}
System.out.println(s.length());
}
public static void process3(Object o){
if(o instanceof String s){
System.out.println(s.length());
}
System.out.println(s); //编译错误:Cannot resolve symbol 's'
}
public static void main(String[] args) {
process1("a string");
process2("a string");
process3("a string");
}
}
编译过程中,为什么提示:Cannot resolve symbol 's'?
思考3分钟......
我相信你已经给出了答案。下面来分析下:
(1)process2方法。
public static void process2(Object o){
if(!(o instanceof String s)){
System.out.println(s); //编译错误:Cannot resolve symbol 's'
return;
}
System.out.println(s.length());
}
只有参数 o 的类型与String类匹配时,才创建绑定变量 s,否则不会创建绑定变量 s。
process2(Object o)方法的逻辑是:只处理字符串类型,其它类型直接返回或者抛出异常。
当参数 o 是字符串类型时,会创建绑定变量 s,process2(Object o)方法除if语句的其它部分是可以访问绑定变量 s 的,在if语句内则无法访问,因为一旦执行if语句内部的逻辑,意味着参数 o 不是字符串类型,绑定变量s没有被创建,所以编译器提示:Cannot resolve symbol 's'。
(2)process2(Object o)方法的逻辑正好相反,请自行分析。