Неявное приведение к строке - toString и int + "" - PullRequest
6 голосов
/ 06 февраля 2012

Почему, когда я использую это:

int a = 1;
methodWithParamString(a + "");

a приводится к String, но я не могу использовать toString () для целого числа?

int a = 1;
methodWithParamString(a.toString());

Разве это не так:a+"" работает как: a.toString() + ""?

Ответы [ 7 ]

9 голосов
/ 06 февраля 2012

Нет, он работает как String.valueOf( a ) + "", что, в свою очередь, ведет себя как new StringBuilder( String.valueOf( a ) ).append( "" ).toString().

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

6 голосов
/ 06 февраля 2012

a приводится к String

Нет. конвертируется в строку.(Вы не можете привести примитивный тип к String, неявно или явно.)

Подробности этого преобразования указаны в JLS - 15.18.1.1 .В спецификации говорится, что для примитивного типа преобразование выполняется «как если бы», вы создали экземпляр соответствующего типа-оболочки и затем вызвали toString() для него.Это оставляет компилятору Java возможность использовать другие подходы при условии, что конечный результат тот же.(Для ссылочных типов преобразование превращает null в "null" и другие не строковые типы в String, вызывая toString().)

JLS заявляет, что конкатенация затем выполняется «как будто»вызов String.concat(...), отмечающий, что JLS явно разрешает оптимизацию последовательностей конкатенаций.(JLS 15.18.1.2 )

2 голосов
/ 06 февраля 2012

Разве это не так: a + "" работает так: a.toString () + ""?

Верно.это не так.

+ внутренне перегружен.и Java не поддерживает вызовы методов примитивов.

0 голосов
/ 05 июня 2014

Способ, которым это достигается в Java, на самом деле немного проще, чем другие ответы.

Использование оператора конкатенации строк со строкой и объектом приводит к вызову метода toString() этого объекта, а затем выполняет конкатенацию строк.

Помните, что всякий раз, когда примитив передается в контекст, где объект будет действительным, Java выполняет «автобокс», преобразовывая int в Integer, double в Double и т. Д.

Таким образом, вы можете думать об этом как о автобоксе с последующим toString () и последующей конкатенацией строк.

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

0 голосов
/ 06 февраля 2012

toString() - это метод в классе Object, любой класс, унаследованный от него, будет иметь этот метод, например Integer или String.Но int - это примитивный тип, а не Object, поэтому метод не существует.

0 голосов
/ 06 февраля 2012

Поскольку int a - это не объект, это тип примитива. Так что у него нет никаких методов. Вы должны использовать бокс:

Integer objectA = new Integer(a);
objectA.toString();
0 голосов
/ 06 февраля 2012

Нет. int - это примитивный тип, поэтому он не является объектом и не может иметь никаких методов.Прочитайте это Я думаю, это будет полезно.Существуют классы-обертки для примитивов, например Integer для int.Вы можете вызвать toString() метод для них.На самом деле String это специальный класс в Java.И вы можете использовать оператор + (и не только) для строк и примитивов.Я думаю, вы найдете полный ответ на ваш вопрос здесь .

...