Почему нельзя отличать 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();