이상한 예외를 발견했습니다.
java.lang.ClassCastException: java.lang.Integer
cannot be cast to java.lang.String
어떻게 가능할까요? 각 개체는 String으로 캐스팅 할 수 있습니다.
코드는 다음과 같습니다.
String myString = (String) myIntegerObject;
감사.
이상한 예외를 발견했습니다.
java.lang.ClassCastException: java.lang.Integer
cannot be cast to java.lang.String
어떻게 가능할까요? 각 개체는 String으로 캐스팅 할 수 있습니다.
코드는 다음과 같습니다.
String myString = (String) myIntegerObject;
감사.
""+myIntegerObject또한 : 작동
Integer.toString(IntegerObject)하고 있었는데이 오류가 발생했지만 만족 스럽습니다 IntegerObject.toString()... 그리고 예, 정말 정수입니다.이 오류가 발생했습니다 ...
String.valueOf()실제로 작동합니다 ...
답변:
이것이 불가능한 이유 :
String과 Integer는 동일한 Object 계층 구조에 있지 않기 때문입니다.
Object
/ \
/ \
String Integer
시도중인 캐스팅은 동일한 계층 구조에있는 경우에만 작동합니다.
Object
/
/
A
/
/
B
이 경우 (A) objB또는 (Object) objB또는 (Object) objA작동합니다.
따라서 다른 사람들이 이미 언급했듯이 정수를 문자열 사용으로 변환하려면 다음을 수행하십시오.
String.valueOf(integer), 또는 Integer.toString(integer)원시의 경우
또는
Integer.toString() 개체에 대한.
(B) objA가 작동하지 않습니다. (A) objA그리고 (B) objB작동합니다.
아니, Integer및 String다른 유형입니다. 정수를 문자열로 변환하려면 String.valueOf(integer),, Integer.toString(integer)프리미티브 또는 Integer.toString()객체를 사용하십시오.
위해 int유형 사용
int myInteger = 1;
String myString = Integer.toString(myInteger);
위해 Integer유형 사용
Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();
toString()방법
String myString = myIntegerObject.toString();
. String가 아닌 것은 명시 적으로 캐스트 할 수 없습니다 String. 다음 중 하나를 사용해야합니다.
"" + myInt;
또는:
Integer.toString(myInt);
또는:
String.valueOf(myInt);
나는 두 번째 형태를 선호하지만 개인적 선택이라고 생각합니다.
편집 확인, 두 번째 양식을 선호하는 이유는 다음과 같습니다. 첫 번째 형식은 컴파일 될 때 a StringBuffer(Java 1.4에서) 또는 a StringBuilder를 1.5 에서 인스턴스화 할 수 있습니다 . 한 가지 더 가비지 수집합니다. 컴파일러는 내가 말할 수있는 한 이것을 최적화하지 않습니다. 두 번째 형식에는 Integer.toString(myInt, radix)16 진수, 8 진수 등을 원하는지 여부를 지정할 수 있는 아날로그도 있습니다. 코드에서 일관성을 유지하려면 (순전히 미학적으로, 제 생각에) 두 번째 형식을 더 많은 곳에서 사용할 수 있습니다.
편집 2 난 당신이 정수는 것을 의미 가정 int아닌가 Integer. 이미 인 경우 Integer사용 toString()하고 완료하십시오.
myIntegerObject.toString()입니다.
문자열 표현을 원하면 myIntegerObject.toString ()을 호출해야합니다.
캐스팅은 비공식 용어를 사용하기 위해 Java에서 변환하는 것과 다릅니다.
객체를 캐스팅한다는 것은 객체가 이미 캐스팅되고 있다는 것을 의미하며 컴파일러에게 그것에 대해 알리는 것입니다. 나는이있는 경우 예를 들어, Foo내가 알고 있음을 참조 FooSubclass인스턴스가, 다음 (FooSubclass)Foo, 컴파일러를 알려줍니다 "를, 인스턴스를 변경 단지가 실제로 있다는 모른다 FooSubclass.
한편,이 Integer입니다 하지String (당신이 지적으로)를 취득하기위한 방법이 있지만, String를 나타내는이 Integer. 없음 없음 예부터 Integer캔 적을 수 없습니다 String, 당신은 캐스팅 할 수 없습니다 Integer에 String.
귀하의 경우 캐스팅이 필요하지 않으면 toString ()을 호출해야합니다.
Integer i = 33;
String s = i.toString();
//or
s = String.valueOf(i);
//or
s = "" + i;
주조. 어떻게 작동합니까?
주어진:
class A {}
class B extends A {}
(A)
|
(비)
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 {}
(A)
/ \
(B1) (B2)
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 i = 33;
//String s = (String)i; - compiler error
String s = (String)(Object)i;
런타임시 : 스레드 "main"의 예외 java.lang.ClassCastException : java.lang.Integer를 java.lang.String으로 캐스트 할 수 없습니다.
String.valueOf (integer)를 사용하십시오 .
정수의 문자열 표현을 반환합니다.
String.valueOf(integer)
toString()이를 String으로 변환 하는 메서드가 있습니다. 여러 답변에서 지적했듯이 이것이 사용해야하는 것입니다. (일부 개체의 경우,toString()매우 반환하지 않습니다 유용한 문자열을하지만, 위해는Integer, 아마 당신이 원하는 정확히 않습니다.)