source

Java에서 Integer를 String에 캐스팅할 수 없는 이유는 무엇입니까?

gigabyte 2023. 1. 22. 22:29
반응형

Java에서 Integer를 String에 캐스팅할 수 없는 이유는 무엇입니까?

몇 가지 이상한 예외가 발견되었습니다.

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

그게 어떻게 가능하죠?각 오브젝트는 String에 캐스팅할 수 있는 거죠?

코드는 다음과 같습니다.

String myString = (String) myIntegerObject;

감사해요.

이것이 불가능한 이유:

String과 Integer는 동일한 Object 계층에 속하지 않기 때문입니다.

      Object
     /      \
    /        \
String     Integer

시도하는 캐스팅은 동일한 계층에 있는 경우에만 작동합니다.

      Object
     /
    /
   A
  /
 /
B

이 경우,(A) objB또는(Object) objB또는(Object) objA효과가 있습니다.

따라서 다른 사용자가 이미 언급했듯이 정수를 문자열로 변환하려면 다음을 사용합니다.

String.valueOf(integer), 또는Integer.toString(integer)원초적,

또는

Integer.toString()오브젝트용입니다.

아니요.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();

아니요. 모든 물체는 캐스트할 수 있습니다.java.lang.Object, 가 아닙니다.String. 임의의 오브젝트를 문자열로 표현하려면toString()method. 이것은 객체를 String에 캐스팅하는 것과는 다릅니다.

개체를 문자열로 변환할 수 있습니다.toString()방법:

String myString = myIntegerObject.toString();

캐스팅에 관한 그런 규칙은 없다.캐스팅이 작동하려면 실제로 캐스팅하려는 유형의 객체가 있어야 합니다.

어떤 것도 명시적으로 캐스팅할 수 없습니다.String그건 아니다String. 다음 중 하나를 사용해야 합니다.

"" + myInt;

또는 다음과 같이 입력합니다.

Integer.toString(myInt);

또는 다음과 같이 입력합니다.

String.valueOf(myInt);

두 번째 양식을 선호하지만, 개인적인 선택이라고 생각합니다.

편집 OK, 두 번째 양식을 선호하는 이유는 다음과 같습니다.첫 번째 폼은 컴파일할 때,StringBuffer(Java 1.4) 또는StringBuilder한 가지 더 쓰레기 수거가 필요합니다.컴파일러는 내가 아는 한 이것을 최적화하지 않는다.두 번째 형태에도 아날로그가 있어요Integer.toString(myInt, radix)16진수, 8진수 등을 지정할 수 있습니다.코드를 일관되게 하고 싶다면(순전히 미적으로) 두 번째 폼을 더 많은 장소에서 사용할 수 있습니다.

편집 2 나는 당신의 정수가 0이라는 것을 의미한다고 생각했다.int이 아니라Integer만약 이미 그 일이라면Integer, 사용만 하면 됩니다.toString()할 수 있을 것 같아.

문자열을 표현하려면 myIntegerObject.toString()을 호출해야 합니다.

캐스팅은 비공식 용어를 사용하는 Java 변환과는 다릅니다.

오브젝트를 캐스팅한다는 것은 그 오브젝트가 이미 그 오브젝트를 캐스팅하고 있다는 것을 의미하며, 컴파일러에게 그 오브젝트를 전달하기만 하면 됩니다.예를 들어, 만약 제가Foo내가 알고 있는 참조FooSubclass으로 instance, instance, "(FooSubclass)Foo는 「인스턴스」라고 것을 해 주세요.인스턴스를 변경하지 말고 실제로는FooSubclass.

★★★★★★★★★★★★★★★★★★★★★.Integer 아니다String처럼) 을 String that thatents 。Integer의 인스턴스가 없기 에.Integer 될 수 StringInteger로로 합니다.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 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.정수를 java.lang에 캐스트할 수 없습니다.스트링

String.valueOf(정수)사용합니다.

정수의 문자열 표현을 반환합니다.

대신 다음과 같이 .toString을 사용합니다.

String myString = myIntegerObject.toString();

언급URL : https://stackoverflow.com/questions/8973381/why-cannot-cast-integer-to-string-in-java

반응형