相关疑难解决方法(0)

为什么在这种特殊情况下,instanceof 模式匹配不能与 else if 一起使用?

以下代码片段无法在 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)

java language-lawyer java-17

27
推荐指数
2
解决办法
1478
查看次数

为什么在一个instanceOf后施放?

在下面的示例中(来自我的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

java polymorphism instanceof

23
推荐指数
6
解决办法
2万
查看次数