powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Что мешает компилятору выполнять сначала Widening, а затем Boxing перед вызовом метода ?
4 сообщений из 4, страница 1 из 1
Что мешает компилятору выполнять сначала Widening, а затем Boxing перед вызовом метода ?
    #38421770
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class CastTest01 {
  static {
    byte k = 93;
    go(k);
    System.exit(0);
  }

  static void go(Short z) { 
    System.out.println("Short"); 
  }
  static void go(Integer z) { 
    System.out.println("Integer"); 
  }
  static void go(Long z) { 
    System.out.println("Long"); 
  }
  static void go(Number z) { 
    System.out.println("Number"); 
  }
  static void go(Object z) { 
    System.out.println("Object"); 
  }
}

Код: plaintext
// Output: Number
Почему вылезло 'Number' - понятно: компилятор упаковал байт в Byte-объект и "увидел" метод, принимающий объект прямого предка (класс Number )

Если же закомментарить методы static void go(Number z) и static void go(Object z), то лезет ошибка компиляции
Код: plaintext
1.
2.
3.
4.
CastTest01.java:4: cannot find symbol
symbol  : method go(byte)
location: class CastTest01
    go(k);
    ^
Ошибку приходится вежливо обходить кастом: go( (short) k);

Вопрос . Что здесь мешает компилятору "добить слева нулями" значение переменной `k` до разрядности short и далее упаковать в Short-объект ? (т.е. чтобы каст не делать).

ЗЫ. Только что перечитал Ководство на эту тему, страницы 290-291 (252-253 "по бумаге"): там разобран пример, НЕ объясняющий по сути ничего. А фраза:
SCJP guide, pg. 291Why didn't the compiler try to use the box-then-widen logic when it tried to deal with the WidenAndBox class? Think about it…if it tried to box first, the byte would have been converted to a Byte. Now we're back to trying to widen a Byte to a Long, and of course, the IS-A test fails. - я вообще не понял, к чему относится %-)
...
Рейтинг: 0 / 0
Что мешает компилятору выполнять сначала Widening, а затем Boxing перед вызовом метода ?
    #38421798
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JLS говорит что так нельзя. Почему JLS так говорит - хз. То ли обратная совместимость. То ли просто логика такая, что результат боксинга должен анбокситься в тот же тип...
...
Рейтинг: 0 / 0
Что мешает компилятору выполнять сначала Widening, а затем Boxing перед вызовом метода ?
    #38421815
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут ещё ответ со ссылкой на ту же OCJP книгу
http://stackoverflow.com/a/13320720
Который говорит, что если бы компилер делал widening и boxing, то это сломало бы обратную совместимость.
Т.е. код из Java 1.4 стал бы линковаться на другие методы в Java 5.
...
Рейтинг: 0 / 0
Что мешает компилятору выполнять сначала Widening, а затем Boxing перед вызовом метода ?
    #38421829
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczВот тут ещё ответ со ссылкой на ту же OCJP книгу
http://stackoverflow.com/a/13320720
Который говорит, что если бы компилер делал widening и boxing, то это сломало бы обратную совместимость.
Т.е. код из Java 1.4 стал бы линковаться на другие методы в Java 5.Ага, вот оно что...
Ясно. Большое спасибо, в который раз выручаете! :-)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Что мешает компилятору выполнять сначала Widening, а затем Boxing перед вызовом метода ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]