Почему автоупаковка Java не расширяется на вызовы метода методов автопомещенных в коробку типов?

51
задан bmargulies 23 May 2012 в 03:28
поделиться

7 ответов

Автоупаковка/распаковывание Java не идет до степени, чтобы позволить Вам разыменовывать примитив, таким образом, Ваш компилятор предотвращает его. Ваш компилятор все еще знает myInt как примитив. Существует статья об этой проблеме в jcp.org .

Автоупаковка главным образом полезна во время присвоения или передачи параметров - разрешение Вам передать примитив как объект (или наоборот) или присвоить примитив объекту (или наоборот).

Поэтому, к сожалению, необходимо было бы сделать это как это: (престижность Patrick, я переключился на Ваш путь)

Integer.toString(myInt);
45
ответ дан yoozer8 7 November 2019 в 10:04
поделиться

Так же на том, что сказал Justin, но необходимо сделать это вместо этого:

Integer.toString(myInt);

Это сохраняет выделение или два и более читаемо.

27
ответ дан Patrick 7 November 2019 в 10:04
поделиться

Еще один способ сделать это состоит в том, чтобы использовать:

String.valueOf(myInt);

Этот метод перегружается для каждого типа примитива и Object. Таким образом, Вы не должны даже думать о типе, который Вы используете. Реализации метода назовут соответствующий метод данного типа для Вас, например, Integer.toString(myInt).

См. http://java.sun.com/javase/6/docs/api/java/lang/String.html .

15
ответ дан SaM 7 November 2019 в 10:04
поделиться

походит на недостаток спецификации мне

существует больше недостатков, и это - тонкая тема. Проверьте это :

public class methodOverloading{
   public static void hello(Integer x){
      System.out.println("Integer");
   }

   public static void hello(long x){
      System.out.println("long");
   }

   public static void main(String[] args){
      int i = 5;
      hello(i);
   }
}

Здесь "долго" печатался бы (не проверили его самостоятельно), потому что компилятор choses расширяющийся по автоупаковке. Будьте осторожны при использовании автоупаковки или не используйте ее вообще!

9
ответ дан Mike Stone 7 November 2019 в 10:04
поделиться

Допустимый синтаксис, самый близкий к Вашему примеру,

((Integer) myInt).toString();

, Когда компилятор заканчивается, это эквивалентно

Integer.valueOf(myInt).toString();

Однако, это не работает, а также стандартное использование, String.valueOf(myInt), потому что, кроме особых случаев, это создает новый Целочисленный экземпляр, тогда сразу выбрасывает его, приводя к более ненужному мусору. (Маленький диапазон целых чисел кэшируется, и доступ доступом к массиву.), Возможно, разработчики языка хотели препятствовать этому использованию по причинам производительности.

Редактирование: я ценил бы его, если downvoter (s) прокомментирует о том, почему это не полезно.

5
ответ дан erickson 7 November 2019 в 10:04
поделиться

В C# целые числа не являются ни ссылочными типами, и при этом они не должны быть упакованы для ToString () , чтобы быть названными. Они продуманные объекты в Платформе (как ValueType, таким образом, у них есть семантика значения), как бы то ни было. В CLR методы на примитивах называют, "косвенно" загружая их на стек (ldind).

1
ответ дан Mark Cidade 7 November 2019 в 10:04
поделиться

Как все отмечали, автобокс позволяет упростить некоторый код, но нельзя делать вид, что примитивы - это сложные типы.

Также интересно: "автобокс - это взлом на уровне компилятора" на Java. В основном автобокс - это странный кладж, добавляемый в Java. Посмотрите на этот пост, чтобы узнать больше о том, насколько он странный.

1
ответ дан 7 November 2019 в 10:04
поделиться
Другие вопросы по тегам:

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