Почему в Java есть обертка для каждого примитивного типа - PullRequest
20 голосов
/ 18 января 2012

Подклассы Number переносят примитивные числовые типы (Byte, Integer, Double, Float, Long и Short).

Какую цель они служат?

Ответы [ 12 ]

17 голосов
/ 18 января 2012

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

11 голосов
/ 18 января 2012

Потому что оболочки Objects.

  • Collections нужны объекты
  • Объекты могут иметь значение instantiated до нуля
  • Мы можем получить NullPointerException вместо странного поведения, если вы, например, создаете экземпляр-1 в примитиве
  • «Обертка» имеет удобный метод
5 голосов
/ 18 января 2012

Многие ранние объектно-ориентированные языки (Smalltalk и т. Д.) Имеют общий "верхний тип" для всех значений, что упрощает определение общих операций, которые не зависят от типа значений, которые они перемещают.

Верхним типом в теории типов, обычно сокращаемым как top или символом вниз (⊤), является универсальный тип - тот тип, который содержит все возможные объекты в интересующей системе типов.

Java не имеет такого верхнего типа, но Object - самый близкий к нему. Наличие сопоставления примитивных значений с экземплярами Object позволяет ему эффективно функционировать как верхний тип.

Базовые возможности языка java.lang.reflect используют Object в качестве замены для типа top - когда вы рефлекторно вызываете метод, который вы передаете в Object s, и возвращаете Object.

2 голосов
/ 18 января 2012

Разработчики Java - по веским или плохим причинам - решили не основывать все типы на Object.Примитивные типы, такие как int, long, char и т. Д., Не основаны на Object и поэтому имеют довольно разную семантику, например, они передаются по значению, а не по ссылке.

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

Например,из-за различий в семантике коллекции должны иметь две версии: одну для объекта и одну для примитивных типов.Просто проще сделать одну версию коллекции и вместо нее обернуть примитивные типы.

2 голосов
/ 18 января 2012

По этой ссылке Java-учебник Причины:

Существует три причины, по которым вы можете использовать объект Number вместо примитива:

  • В качестве аргумента метода, который ожидает объект (часто используется при манипулировании коллекциями чисел).
  • Для использования констант, определенных классом, таких как MIN_VALUE и MAX_VALUE, которые обеспечивают верхнюю и нижнюю границы типа данных.
  • Использование методов класса для преобразования значений в и из других примитивных типов, для преобразования в и из строк и для преобразования между системами счисления (десятичная, восьмеричная, шестнадцатеричная, двоичная).
1 голос
/ 18 января 2012

Классы-оболочки в Java API в основном служат двум основным целям:

  • Чтобы позволить примитивам включаться в действия, зарезервированные для объектов, например, добавляться в Коллекции или возвращаться из метода свозвращаемое значение объекта.
  • Предоставление ассортимента служебных функций для примитивов.Большинство из этих функций связаны с различными преобразованиями: преобразованием примитивов в и из объектов String и преобразованием примитивов и объектов String в и из различных основ (или основ), таких как двоичные, восьмеричные и шестнадцатеричные.
0 голосов
/ 30 сентября 2013

1-й - для того, чтобы сделать Java полностью объектно-ориентированным.

2-й - мы не можем передать примитивный тип по ссылке на метод и многие другие.стандартной структуры данных, реализованной java, работает с объектом: например, (ArrayList, HashSet, HashMap и т. д.), поэтому они нуждаются в этих объектах. ссылка

0 голосов
/ 02 июля 2012

Классы Wrapper - это представители объектов примитивных типов данных, поэтому, когда возникает ситуация, когда они используются как объекты, мы должны их использовать.Использование Wrapper, когда нам нужны объекты, и примитив, когда требуется эффективность.

0 голосов
/ 18 января 2012

Существует определенный тип «указателя», который может указывать на любой тип (например, void в C / C ++).

Я имею в виду java.lang.Object.

Например, вы можете сделать это:

List<String> aList = new ArrayList<String>();  
Object o = aList;

НО это недоступно для примитивов, т. Е. Для примитивов нет ссылочного типа void.Т.е. для примитивного типа нет способа сослаться на любой тип примитива.

Так что если вы хотите иметь алгоритм, который работает с произвольными переменными, вы можете использовать переменные типа java.lang.Object.
Если произвольные значения являются примитивами, используйте соответствующий объектный обертку, чтобы обернуть ихиспользуйте java.lang.Object для управления ими.

Это можно увидеть и в Collections

0 голосов
/ 18 января 2012

Лично я использую их в качестве параметров для методов, поэтому мне не нужно беспокоиться о типе передаваемого числа. Затем я могу использовать методы типа doubleValue (), чтобы получить значение и продолжить, не беспокоясь о что было передано.

Это основная причина создания абстрактного базового класса.

...