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
될 수 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 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
'source' 카테고리의 다른 글
범위를 포함할 때 인덱스에서 먼저 높은 카디널리티 열을 선택하십시오. (0) | 2023.02.01 |
---|---|
큰 파일을 한 줄씩 읽는 방법 (0) | 2023.01.22 |
MySQL/MARIADB에서 사용자 수준 잠금 강제 해제 (0) | 2023.01.22 |
"집약 함수는 WHERE에서 허용되지 않습니다" 오류를 방지하는 방법 (0) | 2023.01.22 |
순서부여된 기본 dict를 구현하는 방법 (0) | 2023.01.22 |