Почему нельзя отличать Integer от String в java?

Я нашел странное исключение:

java.lang.ClassCastException: java.lang.Integer 
 cannot be cast to java.lang.String

Как это возможно? Каждый объект может быть отправлен в String, не так ли?

Код:

String myString = (String) myIntegerObject;

Спасибо.

Ответ 1

Почему это невозможно:

Поскольку String и Integer не находятся в одной иерархии объектов.

      Object
     /      \
    /        \
String     Integer

Кастинг, который вы пытаетесь, работает только в том случае, если он находится в одной иерархии, например

      Object
     /
    /
   A
  /
 /
B

В этом случае будут работать (A) objB или (Object) objB или (Object) objA.

Следовательно, как уже упоминалось ранее, для преобразования целого в использование строки:

String.valueOf(integer) или Integer.toString(integer) для примитива,

или

Integer.toString() для объекта.

Ответ 2

Нет, Integer и String - разные типы. Чтобы преобразовать целое число в строку, используйте: String.valueOf(integer) или Integer.toString(integer) для примитива или Integer.toString() для объекта.

Ответ 3

Для типов int используйте:

int myInteger = 1;
String myString = Integer.toString(myInteger);

Для типов Integer используйте:

Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();

Ответ 4

Нет. Каждый объект может быть отправлен на java.lang.Object, а не на String. Если вам требуется строковое представление любого объекта, вы должны вызвать метод toString(); это не то же самое, что лить объект в строку.

Ответ 5

Вы не можете явно передать что-либо в String, который не является String. Вы должны использовать либо:

"" + myInt;

или

Integer.toString(myInt);

или

String.valueOf(myInt);

Я предпочитаю вторую форму, но я считаю ее личным выбором.

Изменить ОК, вот почему я предпочитаю вторую форму. Первая форма при компиляции могла бы создать экземпляр StringBuffer (в Java 1.4) или StringBuilder в 1.5; еще одна вещь - собирать мусор. Насколько я могу судить, компилятор не оптимизирует это. Вторая форма также имеет аналог Integer.toString(myInt, radix), который позволяет указать, хотите ли вы шестнадцатеричный, восьмеричный и т.д. Если вы хотите быть последовательным в своем коде (чисто эстетически, я полагаю), вторая форма может использоваться в большем количестве мест.

Изменить 2 Я предположил, что вы имели в виду, что ваше целое число было int, а не Integer. Если он уже есть Integer, просто используйте toString() на нем и сделайте это.

Ответ 6

Вы должны вызвать myIntegerObject.toString(), если вам требуется представление строки.

Ответ 7

Объекты могут быть преобразованы в строку с помощью метода toString():

String myString = myIntegerObject.toString();

Нет такого правила о литье. Для того, чтобы кастинг работал, объект должен быть того типа, который вы используете.

Ответ 8

Кастинг отличается от преобразования в Java, чтобы использовать неформальную терминологию.

Листинг объекта означает, что объект уже является тем, к которому вы его прикладываете, и вы просто рассказываете компилятору об этом. Например, если у меня есть ссылка Foo, которую я знаю, является экземпляром FooSubclass, тогда (FooSubclass)Foo сообщает компилятору: "Не изменяйте экземпляр, просто знайте, что это на самом деле a FooSubclass.

С другой стороны, Integer не является String, хотя (как вы указываете) существуют методы получения String, который представляет Integer. Поскольку ни один экземпляр Integer не может быть String, вы не можете отбрасывать Integer до String.

Ответ 9

В вашем случае не требуется кастинг, вам нужно вызвать toString().

Integer i = 33;
String s = i.toString();
//or
s = String.valueOf(i);
//or
s = "" + i;

Кастинг. Как это работает?

Дано:

class A {}
class B extends A {}

(А)
  |
(B)

B b = new B(); //no cast
A a = b;  //upcast with no explicit cast
a = (A)b; //upcast with an explicit cast
b = (B)a; //downcast

A и B в том же дереве наследования, и мы можем это сделать:

a = new A();
b = (B)a;  // again downcast. Compiles but fails later, at runtime: java.lang.ClassCastException

Компилятор должен разрешить все, что может работать во время выполнения. Однако, если компилятор знает со 100%, что бросок не может работать, компиляция завершится неудачно.
Дано:

class A {}
class B1 extends A {}
class B2 extends A {}

        (А)
     /       \
(В1)       (В2)

B1 b1 = new B1();
B2 b2 = (B2)b1; // B1 can't ever be a B2

Ошибка: Неконвертируемые типы B1 и B2. Компилятор знает со 100%, что бросок не может работать. Но вы можете обмануть компилятор:

B2 b2 = (B2)(A)b1;

но в любом случае во время выполнения:

Исключение в потоке "main" java.lang.ClassCastException: B1 нельзя отнести к B2

в вашем случае:

          (объект)
           /       \
(Integer)       (String)

Integer i = 33;
//String s = (String)i; - compiler error
String s = (String)(Object)i;

во время выполнения: исключение в потоке "main" java.lang.ClassCastException: java.lang.Integer нельзя передать в java.lang.String

Ответ 10

Используйте String.valueOf(integer).

Он возвращает строковое представление целого числа.

Ответ 11

Используйте .toString, как показано ниже:

String myString = myIntegerObject.toString();