В Java, почему бы не расширить затем поле?

В Java мы можем упаковать и затем расшириться. Почему наклон мы расширяемся и поле? Поскольку исключая:

 class WidenAndBox{
  static void go(Long x)  {   }
  public static void main(String [] args)
   {
    byte b=5;
    go(b);
   }
}

Ошибка компилятора

5
задан nos 12 January 2010 в 18:40
поделиться

4 ответа

Я не знаком с тем, как была написана спецификация, но в общем, вы не кастинг автоматически между несовместимыми классами. Расширение примитивов - это отдельный вопрос, а правила расширения Java были изложены задолго до того, как в язык был добавлен автобокс. Это компромисс между тем, чтобы компилятор ловил ваши ошибки и не раздражал вас мелкими деталями.

В случае с вашим примером, если бы вы долго занимались автобоксированием, вы тоже были бы в порядке, или если бы вы сделали функцию, которая принимала в качестве параметра Number, вы тоже были бы в порядке. Вы можете подумать, что компилятор должен помочь вам в этом, понимая, что байт может быть легко распакован и перебоксован как Long, но люди, которые делают компилятор, не согласны с этим, и я тоже не согласен.

6
ответ дан 18 December 2019 в 14:46
поделиться

бросит его в долгое время.

1
ответ дан 18 December 2019 в 14:46
поделиться

Я считаю, что главная причина - производительность. Если бы Вы разрешили произвольную комбинацию расширения и (un)бокса, то необходимо было бы проверить на наличие более подходящих методов. Особенно в контексте, когда функции берут несколько примитивных параметров малого диапазона, количество возможных комбинаций может стать достаточно большим.

2
ответ дан 18 December 2019 в 14:46
поделиться

Просто приведем его к типу long

 go( (long) b);
1
ответ дан 18 December 2019 в 14:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: