キャストが必要ない場合は、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;
とにかく実行時に:
スレッド「メイン」の例外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にキャストできません
toString()
それを文字列に変換するメソッドがあります。いくつかの回答が指摘するように、それを使用する必要があります。(オブジェクトによってtoString()
は、非常に便利な文字列を返さないものもありますが、の場合はInteger
、おそらく望みどおりの結果を返します。)