Подтвердить что ты не робот

Почему возвращает 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. Почему второй метод компилируется?

4b9b3361

Ответ 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 вместо этого.