Почему вы не можете привести целое число к строке? - PullRequest
1 голос
/ 07 марта 2012

Это то, чего я никогда не понимал в Java. Допустим, у меня есть:

int x = 4;

сейчас не могу этого сделать

functionThatRequiresString(x) или functionThatRequiresString((String)x)

Теперь я не могу передать функцию, которая требует строку переменной x. Я также не могу привести его из типа int в строку. Теперь нормальные способы сделать это будут:

Integer.toString(x) или String.valueOf(x)

Теперь, почему я могу это сделать?

functionThatRequiresString(""+x)

Чем это отличается от приведения целого числа к строке?

Ответы [ 5 ]

3 голосов
/ 07 марта 2012

Просто для полноты мы можем посмотреть на скомпилированный байт-код:

int i = 1;
String s1 = "" + i;
String s2 = Integer.toString(i);

Использование JDK 1.5.0_16 (древний, я знаю, но более новые JDK не будут отличаться, я думаю), будет компилироваться в:

   0:   iconst_1
   1:   istore_1
   2:   new     #2; //class java/lang/StringBuilder
   5:   dup
   6:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   9:   ldc     #4; //String
   11:  invokevirtual   #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   14:  iload_1
   15:  invokevirtual   #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   18:  invokevirtual   #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   21:  astore_2
   22:  iload_1
   23:  invokestatic    #8; //Method java/lang/Integer.toString:(I)Ljava/lang/String;
   26:  astore_3

Итак, когда вы используете s1 = "" + i", то, что вы на самом деле делаете:

s1 = new StringBuilder().append("").append(i).toString();

(который создает новый объект и вызывает append(String), за которым следует append(int) метод StringBuilder, а затем преобразует его в строку.

Так что подобные Integer.toString(int) более эффективны ...

3 голосов
/ 07 марта 2012

Приведение означает, что вы говорите компилятору: «У меня здесь есть объект типа A, но я хочу, чтобы вы относились к нему как к типу B. Не выдает ошибку, потому что он не похож на B тебе ".

Приведение не выполняет никаких преобразований (по крайней мере, для непримитивных типов). Если при запуске программы объект действительно не относится к типу B, вы получите ClassCastException.

Вы не можете привести int к String, потому что int просто не String - вы можете сказать компилятору, что это так, но вы получите ClassCastException, когда вы запустите программу.

Другие примеры, которые вы приведете, будут преобразовывать (не приведен) в int в String.

2 голосов
/ 07 марта 2012

Приведение имеет конкретное значение, которое заключается в изменении типа ссылки, но не типа или содержимого ссылочного объекта.

""+x имеет особый вариант использования, который относится только к строкам.Вы не можете конвертировать в любой другой тип данных таким образом.

В Java нет концепции "приведения" из одного типа объекта к другому.

1 голос
/ 07 марта 2012

Короткий ответ: вы не можете привести к int к String, поскольку String не является родительским или дочерним классом int.Приведение говорит о том, как вы просматриваете объект в разных связанных классах.

Что вы действительно спрашиваете (я думаю), почему Java не автоматически конвертирует между типами для вас?

Ответ и причина, по которой вы не можете это сделать functionThatRequiresString(x), заключается в том, что Java является типобезопасным и настаивает на том, чтобы вы передавали значения правильного типа в методы.Преимущество этого в том, что вам не сложно найти ошибки, когда вы передаете неправильный тип функции, но она автоматически преобразуется в правильный тип, так что вы кодируете компиляцию, но при запуске работаете очень странно.Недостатком, как вы видели, является то, что это менее удобно, когда вы хотите выполнить преобразование.

Причина, по которой можно делать что-то вроде "" + x, заключается в том, что это такая распространенная операция, что компилятор обрабатывает все преобразования за вас.Поскольку вы явно создаете строку здесь, безопасно выполнить преобразование.

1 голос
/ 07 марта 2012

Приведение int к String просто невозможно в Java. В выражении:

functionThatRequiresString(""+x)

нет приведения, что происходит, если вы вызываете оператор +, который возвращает строку, если один из аргументов является строкой.

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