Джавак и Примитивы: в штучной упаковке и без коробки - PullRequest
1 голос
/ 24 мая 2011

У меня вопрос: почему примитивные типы должны быть обернуты в объект, когда также есть возможность, чтобы компилятор установил правильные вещи для вас?

  1. вызывает примитивное значение x'sметоды могут быть переведены из x.call () в X.call (x) - это то, что я пытаюсь проиллюстрировать ниже.
  2. Обобщения не хранятся во время выполнения (верно?), поэтому это не так.В случае, если вам нужен доступ к информации о классе во время выполнения - вы можете просто заменить каждый экземпляр Integer на int и переписать вызовы методов, как указано выше, и в итоге получить исполняемый код.

Итак, в принципе, чтоЯ спрашиваю: что мне здесь не хватает?


Я долго размышлял над этим: почему компилятор Java не может переводить ...

int a = 482;
int b = 12;
System.out.println((a + b).toHexString());

... к следующему коду ...

int a = 482;
int b = 12;
System.out.prinln(Ints.toHexString(a + b));

... и, таким образом, убрать всю необходимость в упаковке и распаковке?

(Таким образом, вызовы методов компиляции для (статические) вызовы функций и хранение единственного экземпляра Int.class на случай, еслинеобходимо - например, после вызова Ints.getClass (_)?)


Комментарий добавлен для ясности:

@ Адам: Нет, я не думаю, что это вызывает бокс/ распаковка.В примере делается попытка проиллюстрировать, как примитивы могут рассматриваться как объекты в языке, но как примитивы компилятором.Это устранит (незначительные) накладные расходы во время выполнения и запутанную вещь в языке.Поэтому заданный вопрос был именно таким: почему чрезвычайно талантливые разработчики компиляторов не выбрали это решение?Потому что, если они этого не сделали, должна быть явная невозможность, которую я не вижу.И я хотел бы знать, что это такое.- Пепийн

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

Полагаю, вы имели в виду Integer.toHexString, а не Ints.toHexString.Последний не является частью java.lang, и компилятор не сможет ничего узнать об этом.

Теоретически, компилятор может переводить вызовы (a + b).toHexString() в Integer.toHexString(a + b), если язык Java указываеттакой перевод.(Например, автобокс от int a до Integer задается равным Integer.valueOf(a).)

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

1 голос
/ 24 мая 2011

Таким образом, мы можем отобразить методы, вызываемые на примитивных типах, статическим методам их типов-оболочек, хорошо.

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

Бокс необходим, если вы хотите обработать примитивное значение как объект, например:

  • передать его методу, который принимает только объекты
  • поместите его в переменную типа объекта
  • возвращает его из метода, который должен возвращать объекты

Особые (но довольно важные) случаи из них:

  • положить его в массив объектов
  • положить в коллекцию

Распаковка необходима, если мы получили такой коробочный примитив и хотим иметь его чистую форму, например, после вызова метода, который возвращает объекты, или взятия значения из переменной.

До Java 5 (или 1.5) нам приходилось делать всю эту упаковку и распаковку вручную, методом .valueOf() или toXXX(). Теперь это делается автоматически при необходимости (автобокс).

0 голосов
/ 24 мая 2011

Что бы компилятор сделал для

List<Integer> list = new ArrayList<Integer>();
list.add(5);
int i = list.get(0);

Вам нужен экземпляр Integer, отсюда и необходимость в упаковке / распаковке.

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