Назначение динамического типа в Java — это ошибка в 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");
        }
                           
   }

Переменная dayOfTheWeek становится Integer, если переключатель выпадает на оператор default, тогда как та же переменная становится String, когда она попадает в один из допустимых cases

Разве это не то, что компилятор должен уловить, и почему это вообще разрешено? есть ли реальный вариант использования для этого?

Совет: когда вы спрашиваете «это ошибка в Java», то в 99 случаях из 100 это не так.

Joachim Sauer 22.02.2023 13:55

Это не баг, это фича

Pawan.Java 22.02.2023 13:58

И просто для протокола: напомните себе о минимальном воспроизводимом примере. Включите фактический и ожидаемый результат. (Здесь я ожидал бы, что тип всегда будет строковым, и что компилятор превратит 2000 в "2000"... но да, пока это только предположение). Итак: если вы проверили это, скажем, с вводом 0 и вводом -1, включите вывод в свой вопрос, пожалуйста.

GhostCat 22.02.2023 13:58

Ожидаете ли вы, что это скомпилируется: var output = someBoolean ? "Sunday" : 2000;?

Sotirios Delimanolis 22.02.2023 13:59

Тип становится Integer в одном случае и String в другом случае

Arun 22.02.2023 13:59
Object также является допустимым типом
Thiyagu 22.02.2023 13:59

rimesc 22.02.2023 14:01
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
1
7
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом случае var dayOfTheWeek будет примерно эквивалентно Object dayOfTheWeek. *

Таким образом, (статический) тип переменной всегда будет одним и тем же: тот, который может принимать как значение Integer, так и значение String, если это необходимо.

Значение, на которое он фактически ссылается во время выполнения, будет либо String, либо Integer, в зависимости от переданного значения day.

Я получаю это сейчас. Это имеет смысл. так что var теперь общего типа. Спасибо за ответ

Arun 22.02.2023 14:01

@Arun: я не уверен, что вы подразумеваете под «общим типом». Если вы просто имеете в виду «тип, который может содержать оба», то да. Если вы имеете в виду «тип, который использует дженерики», то вы следуете отвлекающему маневру: важно только то, что реальный тип, определяемый var, является супертипом как String, так и Integer. Если бы это было просто Object, это тоже сработало бы.

Joachim Sauer 22.02.2023 14:03

Да, теперь я понял. Ключевое слово var получает тип, который является супертипом как Int, так и String. Спасибо

Arun 22.02.2023 14:05

См. JLS § 15.28.1: «В противном случае к каждому результирующему выражению, имеющему примитивный тип, применяется бокс-преобразование (§5.1.7), после чего тип выражения-переключателя является результатом применения преобразования захвата (§ 5.1.10) к наименьшей верхней границе (§4.10.4) типов результирующих выражений».

MC Emperor 22.02.2023 14:06

@Arun Целое число, а не целое.

Andy Turner 22.02.2023 14:29

Другие вопросы по теме