无法解析模式匹配开关表达式中的符号“名称”

问题描述 投票:0回答:1

当我使用“var”这个词时,IDE 给出一个错误:

错误:无法解析符号“var”
预计为 ',' 或 ')'
无法解析符号“名称”

代码:

import static java.lang.System.*;

public class hello {
    sealed interface ToGreet {};
    record User(String name) implements ToGreet {};
    record World() implements ToGreet {};

    public static void main(String... args) {
        switch (args.length > 0 ? new User(args[0]) : new World()) {
            case User(var name) -> out.println("Hello " + name);
            case World w -> out.println("Hello World!");
        }
    }
}

那么为什么会发生这种情况呢?我该如何解决?

图片:



pattern-matching java-19
1个回答
0
投票

我不知道您为什么会收到此特定错误消息。代码无法编译的实际原因是不同的。

条件表达式

args.length > 0 ? new User(args[0]) : new World()
的类型为
Object
。因此,您应该会收到一条错误消息,指出
An enhanced switch statement should be exhaustive; a default label expected

编译器不会推断此表达式始终生成

ToGreet
实例,因此不足以指定此密封接口的两种可能实现的情况。

有几个选项可以修复错误。

使用中间

ToGreet
变量将条件表达式分配给:

ToGreet greet = args.length > 0 ? new User(args[0]) : new World();
switch (greet) {
    case User(var name) -> out.println("Hello " + name);
    case World w -> out.println("Hello World!");
}

添加默认标签:

switch (args.length > 0 ? new User(args[0]) : new World()) {
    case User(var name) -> out.println("Hello " + name);
    case World w -> out.println("Hello World!");
    default -> throw new IllegalArgumentException ();
}

Object
添加案例:

switch (args.length > 0 ? new User(args[0]) : new World()) {
    case User(var name) -> out.println("Hello " + name);
    case World w -> out.println("Hello World!");
    case Object o -> throw new IllegalArgumentException ();
}
© www.soinside.com 2019 - 2024. All rights reserved.