У меня сложилось впечатление, что компилятор обеспечит тип, когда объявлено ключевое слово 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
Разве это не то, что компилятор должен уловить, и почему это вообще разрешено? есть ли реальный вариант использования для этого?
Это не баг, это фича
И просто для протокола: напомните себе о минимальном воспроизводимом примере. Включите фактический и ожидаемый результат. (Здесь я ожидал бы, что тип всегда будет строковым, и что компилятор превратит 2000 в "2000"... но да, пока это только предположение). Итак: если вы проверили это, скажем, с вводом 0 и вводом -1, включите вывод в свой вопрос, пожалуйста.
Ожидаете ли вы, что это скомпилируется: var output = someBoolean ? "Sunday" : 2000;?
Тип становится Integer в одном случае и String в другом случае
Object
также является допустимым типом
В этом случае var dayOfTheWeek будет примерно эквивалентно Object dayOfTheWeek. *
Таким образом, (статический) тип переменной всегда будет одним и тем же: тот, который может принимать как значение Integer, так и значение String, если это необходимо.
Значение, на которое он фактически ссылается во время выполнения, будет либо String, либо Integer, в зависимости от переданного значения day.
Я получаю это сейчас. Это имеет смысл. так что var теперь общего типа. Спасибо за ответ
@Arun: я не уверен, что вы подразумеваете под «общим типом». Если вы просто имеете в виду «тип, который может содержать оба», то да. Если вы имеете в виду «тип, который использует дженерики», то вы следуете отвлекающему маневру: важно только то, что реальный тип, определяемый var, является супертипом как String, так и Integer. Если бы это было просто Object, это тоже сработало бы.
Да, теперь я понял. Ключевое слово var получает тип, который является супертипом как Int, так и String. Спасибо
См. JLS § 15.28.1: «В противном случае к каждому результирующему выражению, имеющему примитивный тип, применяется бокс-преобразование (§5.1.7), после чего тип выражения-переключателя является результатом применения преобразования захвата (§ 5.1.10) к наименьшей верхней границе (§4.10.4) типов результирующих выражений».
@Arun Целое число, а не целое.
Совет: когда вы спрашиваете «это ошибка в Java», то в 99 случаях из 100 это не так.