当我使用“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!");
}
}
}
那么为什么会发生这种情况呢?我该如何解决?
图片:
我不知道您为什么会收到此特定错误消息。代码无法编译的实际原因是不同的。
条件表达式
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 ();
}