以下代码片段无法在 javac 版本 17 (Temurin) 上编译
class Instanceof {
static void doesNotWork(Object o) {
if (o == null) {
throw new Error();
} else if (!(o instanceof String s)) {
throw new Error();
}
System.out.println(s); // error here
}
}
Run Code Online (Sandbox Code Playgroud)
它会生成此错误:找不到符号
cannot find symbol
symbol: variable s
location: class Instanceof
Run Code Online (Sandbox Code Playgroud)
然而,以下(在我看来)等效的变体是有效的: 使用显式的 else 块:
static void doesWork(Object o) {
if (o == null) {
throw new Error();
} else if (!(o instanceof String s)) {
throw new Error();
} else …Run Code Online (Sandbox Code Playgroud) 在下面的示例中(来自我的coursepack),我们希望为Square实例c1提供一些其他对象的引用p1,但前提是这两个对象是兼容的类型.
if (p1 instanceof Square) {c1 = (Square) p1;}
Run Code Online (Sandbox Code Playgroud)
我在这里不明白的是,我们首先检查p1确实是一个Square,然后我们仍然施展它.如果是Square,为什么演员?
我怀疑答案在于明显和实际类型之间的区别,但我仍然感到困惑......
编辑:
编译器将如何处理:
if (p1 instanceof Square) {c1 = p1;}
Run Code Online (Sandbox Code Playgroud)
Edit2:
问题是instanceof检查实际类型而不是表观类型?然后演员改变了表观类型?
谢谢,
JDelage