Конверсии и Акции - PullRequest
2 голосов
/ 17 мая 2009

Мне просто интересно, почему это работает (на Java):

byte b = 27;

но будучи объявленным методом так:

public void method(byte b){
    System.out.println(b);
}

Это не работает:

a.method(27);

Выдает ошибку компилятора следующим образом:

`The method method(byte) in the type App is not applicable for the arguments (int)`

Чтение это не дает мне никакой подсказки (возможно, я что-то неправильно понимаю).

Заранее спасибо.

Ответы [ 4 ]

9 голосов
/ 17 мая 2009

Причина присвоения

byte b = 27;

работы обусловлены разделом 5.2 спецификации языка Java (преобразование назначения), которая включает в себя:

Кроме того, если выражение является константным выражением (§15.28) типа byte, short, char или int:

Сужение примитивного преобразования может использоваться, если тип переменной byte, short или char, а также значение константное выражение представимый в типе переменная.

Другими словами, язык имеет специальное положение для этого случая с заданиями. Обычно не существует неявного преобразования из int в byte.

Интересно, что в этом отношении C # работает по-другому (несмотря на то, что он похож на Java во многих других аспектах основных функций) - вызов метода действителен в C #.

1 голос
/ 17 мая 2009

Простой ответ - байт занимает 1 байт памяти, а целое число обычно составляет 4 байта.

Без явной попытки приведения типа int к байту подразумеваемое принуждение отсутствует, поскольку целое число размером, скажем, 10790 потеряло бы информацию, если его урезать до одного байта.

0 голосов
/ 17 мая 2009

По умолчанию Java будет рассматривать числовое значение, такое как 27, как целочисленный тип. Подумайте об этом в аналогичном аспекте, если вы скажете 123.45, он увидит это как число с плавающей точкой, а «привет» - это строка. Это статические значения, а не переменные, поэтому вам нужно привести к байту, например:

a.method((byte)27);
0 голосов
/ 17 мая 2009

Процесс получения одного числового значения и преобразования его в другое без вашей помощи называется повышением. Например, вы берете 1-байтовое число и превращаете его в 4-байтовое число, заполняя нули. Это (как правило) безопасно, поскольку диапазон возможных значений в типе цели больше, чем в типе источника.

Когда происходит обратное, например, взятие целого числа и преобразование в байт, это объявление «понижения», которое не является автоматическим, вы должны форсировать его, так как происходит потеря значения.

Что здесь происходит, так это то, что 27 интерпретируется как int. Само выражение является целым числом, и затем оно отправляется методу, который ожидает байт. Другими словами, тот факт, что вы помещаете его в вызов метода, который принимает байт, не меняет того факта, что Java с самого начала считает, что это немного.

Я не помню точно, как определять байтовые константы в Java, но, вообще говоря, число, подобное 27, является магическим числом. Вы можете написать

final byte MY_CONSTANT_THAT_MEANS_27_BUT_WITH_MEANINGFUL_NAME = 27;

А затем вызовите вашу функцию с этой константой вместо 27.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...