Java 中的动态类型分配 - 这是 Java 中的错误吗?

Aru*_*run -1 java

我的印象是,当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

这不是编译器应该捕获的东西吗?为什么它首先被允许?这有真正的用例吗?

Joa*_*uer 9

在这种情况下var dayOfTheWeek将大致相当于Object dayOfTheWeek*

因此,变量的(静态)类型将始终相同:根据需要可以同时采用一个Integer和一个值。String

它在运行时实际引用的值将是aStringan Integer,具体取决于day传入的值。

* 因为StringInteger也共享接口,SerializableComparable很可能是这样的 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,说实话,这很拗口。

  • @Arun:我不确定“通用类型”是什么意思。如果您只是指“一种可以同时容纳两者的类型”,那么是的。如果您的意思是“使用泛型的类型”,那么您就在转移注意力:重要的是由“var”决定的实际类型是“String”和“Integer”的超类型。如果它只是“Object”,它也可以工作。 (3认同)
  • 请参阅 [JLS § 15.28.1](https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.28.1): *" 否则,装箱转换 (§ 5.1.7) 应用于每个具有基本类型的结果表达式,之后 switch 表达式的类型是将捕获转换(第 5.1.10 节)应用于该函数的最小上限(第 4.10.4 节)的结果结果表达式的类型。"* (3认同)