Почему возвращает int в методе, который должен возвращать короткую работу?
static void method(short x)
{
//do some stuff
}
Когда я вызвал метод метода из main
, используя следующую строку.
method(1); // compilation failed
Я знаю, что вызов выше недействителен, потому что параметр 'x' ожидает короткий, и мы передаем int.
Я дополнительно протестировал вышеуказанную концепцию и закодировал другой метод:
static short method()
{
//do some stuff
return 1;
}
но выше метод работает нормально, где тип возврата является коротким, и мы возвращаем int.
Почему второй метод компилируется?
Ответы
Ответ 1
Оператор return
(JLS 14.17) может использовать преобразование присваивания (JLS 5.2) для преобразования из исходного типа выражения в тип возвращаемого значения.
Преобразование присваивания включает в себя возможность преобразования константного выражения в более узкий тип, если он находится в диапазоне целевого типа. Поэтому постоянное выражение типа int
может быть преобразовано в short
, когда значение находится в диапазоне short
.
аргументы метода не проходят преобразование присваивания - они используют метод invocation conversion (JLS 5.3), который не включает это постоянное преобразование.
С точки зрения того, почему это происходит, я подозреваю, что это просто упрощает рассуждения. Преобразования присваивания всегда имеют один целевой тип - в то время как в случае аргументов метода могут возникать различные различные перегрузки, поэтому должно быть больше правил для определения того, насколько конкретным будет преобразование постоянного выражения. Это просто предположение, хотя и это явно можно было бы сделать. (С# позволяет это, например.)
Ответ 2
Ваше значение, похоже, соответствует короткому. Попробуйте вернуть то, что не соответствует 16 бит, например целочисленное значение больше 32767, и вы получите ошибку времени компиляции.
Ответ 3
Не должно быть проблем с любым номером в диапазоне -32,768 и максимальным значением 32 767
На самом деле вы можете использовать short
для сохранения памяти в больших массивах, в ситуациях, когда
экономия памяти на самом деле имеет значение.
Для сравнения, тип данных int
представляет собой 32-разрядное двухзначное целочисленное целое число. Он имеет минимальное значение -2,147,483,648 и максимальное значение 2,147,483,647. Для интегральных значений этот тип данных обычно является выбором по умолчанию, если нет причины (например, экономии памяти), чтобы выбрать что-то еще. Этот тип данных, скорее всего, будет достаточно большим для чисел, используемых вашей программой, но если вам нужен более широкий диапазон значений, используйте long
вместо этого.