我的印象是,当var声明 Java 中的关键字时,编译器将确保类型,而我无法根据条件动态分配类型。但我不确定我的理解是否错误,或者这是Java中的一个错误。看我下面的代码
public static void printDayOfWeek_new_style(int day) {
var dayOfTheWeek = switch (day) {
case 0 -> "Sunday";
case 1 -> "Monday";
case 2 -> "Tuesday";
case 3 -> "Wednesday";
case 4 -> "Thursday";
case 5 -> "Friday";
case 6 -> "Saturday";
default -> 2000;
};
System.out.println("New >> "+dayOfTheWeek);
if (dayOfTheWeek instanceof String) {
System.out.println("yes it is a string");
}else if (dayOfTheWeek instanceof Integer) {
System.out.println("yes it is an integer");
}
}
Run Code Online (Sandbox Code Playgroud)
如果 switch 落在语句中,则该dayOfTheWeek变量将变为 an ,而当同一变量落在有效s中时,该变量将变为 aIntegerdefaultStringcase
这不是编译器应该捕获的东西吗?为什么它首先被允许?这有真正的用例吗?
在这种情况下var dayOfTheWeek将大致相当于Object dayOfTheWeek。*
因此,变量的(静态)类型将始终相同:根据需要可以同时采用一个Integer和一个值。String
它在运行时实际引用的值将是a或Stringan Integer,具体取决于day传入的值。
* 因为String和Integer也共享接口,Serializable它Comparable很可能是这样的 Serializable & Comparable<?>东西,不能被编写为正确的类型,但var并不关心:它可以处理你不能直接用 Java 编写的类型。IntelliJ IDEA 将类型描述为java.io.Serializable & Comparable<? extends java.io.Serializable & Comparable<?> & java.lang.constant.Constable & java.lang.constant.ConstantDesc> & java.lang.constant.Constable & java.lang.constant.ConstantDesc,说实话,这很拗口。
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |