2015-06-19 5 views
0

При исправлении кода для this question я понял, что автобоксинг не работает для всех типов. Этот код компилируется:Нет автобоксинга для BigInteger?

Integer y = 3; 

Но делать то же самое с BigInteger не компилируется:

BigInteger x = 3; 

-> "Несоответствие типов: невозможно преобразовать из INT в BigInteger"

Нет ли Autoboxing для BigInteger? Если нет, то каково правило для типов, поддерживающих автобоксинг, а почему нет BigInteger?

+6

Для BigInteger нет распакованного типа. Поэтому нет автобоксинга. – talex

+1

Об этом сообщается официальная ошибка: http://bugs.java.com/view_bug.do?bug_id=6407464. –

+0

@talex: И зачем вам * нужен * точно соответствующий unboxed тип? Поскольку конверсии являются только односторонними, не могли бы вы использовать для этого 'int' или' long'? – mastov

ответ

3

Прежде всего, обратите внимание, что BigInteger является частью java.math, а не java.lang, и поэтому не получил специального обращения на этом языке. Все типы в штучной упаковке находятся в java.lang, поэтому язык Java может относиться к ним специально. Такое рассмотрение может включать в себя бокс, ниточки в постоянных бассейнов, объекты класса, живущих в специализированных областях памяти и т.д.

Во-вторых, справочный документ под названием Java Language Specification (или JLS для краткости) описывает это точно:

Конверсия бокса преобразует выражения примитивного типа в соответствующие выражения ссылочного типа. В частности, следующие девять преобразований называются преобразования бокса:

  • От логического типа к типу Boolean

  • От типа байта типа Байт

  • От типа короткого ввести Short

  • От типа char для ввода символов

  • От типа int ввести Integer

  • От типа долго, чтобы набрать Long

  • От типа поплавка типа Float

  • От типа двойной к типу Double

  • От нулевого типа к нулевому типу

Source

Однако существует request, позволяющий автообновить BigInteger и придавая особое значение различным математическим операторам при применении к объектам BigInteger.

+0

@mastov Это потому, что 'BigInteger' не является частью языка Java. Это часть Java API. – hexafraction

+0

Откинутый назад. Это цитата из JLS, и JLS не говорит «От типа void до типа Void». Это также невозможно установить в поле или удалить, поскольку экземпляры типа «Void» не могут быть экземплярами. – hexafraction

+0

@mastov Нет проблем, нет необходимости удалять. – hexafraction

0

autoboxing работает между примитивами и их соответствующим классом Wrapper. Поскольку BigInteger не является именно классом-оболочкой для int, следовательно, ошибка.

+0

Это не вызовет технической проблемы, потому что преобразование работает только в одностороннем порядке, поэтому вы можете использовать 'int' или' long' как примитивный.Так что это концептуальная вещь, а не по техническим причинам? – mastov

0

Прочитайте документацию для BigInteger.Вы увидите, что он не нуждается в autoboxing, потому что это уже класс, а не примитив. Для того, чтобы делать то, что вы хотите взглянуть на методы, предусмотренные в BigInteger классе, в частности, статический BigInteger.valueOf() метод:

BigInteger x = BigInteger.valueOf(3);

+1

«Вы увидите, что он не требует автобоксинга, потому что он уже является классом, а не примитивным», «java.lang.Integer» и т. Д. Также являются классами, а не примитивами. – hexafraction

+0

'Integer' - это класс; 'int 'является примитивным. Autoboxing преобразует 'int' в' Integer'. Autoboxing работает только от конкретных примитивов до определенных классов; это не универсальный конвертер между всеми примитивами и всеми классами. Если вы хотите конвертировать между примитивом и классом, где нет автобоксинга, тогда вы сочли конкретный метод выполнения работы. В случае конверсий 'int' в' BigInteger', используйте метод 'valueOf()'. – rossum

+0

Rossum: Я знаю, что такое autoboxing. Однако ваше высказывание лексически не было правильной аргументацией. – hexafraction

0

Позвольте мне ответить, поднимая вопрос:

Идея BitInteger должен представлять целые числа произвольной точности. Как именно вы представляете себе «распаковать» объекты такого класса в существующие примитивные типы?

+0

Вопрос был о «autoboxing», а не «unboxing». Но да, может быть, они не хотят делать «автобоксинг» за то, что они не могут «распаковать». Может быть. – mastov

2

Нет ли автобоксинга для BigInteger?

Juned и hexafraction уже указывали на то, что Autoboxing работы между примитивов и их соответствующих Упаковщики.

Как почему BigInteger не имеет соответствующих примитивным бы равносильно ответу на второй вопрос:

Если нет, то это правило для типов, поддерживающих Autoboxing и почему не BigInteger включены ?

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

Каждый современный компьютер имеет инструкцию машинного языка для целочисленного добавления. Поэтому он также может иметь очень простой байтовый код в JVM. A сложный тип, такой как BigInteger, не может быть обработан таким образом, и он не может быть переведен в простой байтовый код. Поэтому он не может быть примитивным.

Поскольку это класс, а Java не поддерживает перегрузку оператора, вам необходимо использовать его методы и конструкторы вместо простых арифметических операторов, которые вы сможете использовать с примитивами.

Смежные вопросы