私はいくつかの奇妙な例外を見つけました:
Java.lang.ClassCastException: Java.lang.Integer
cannot be cast to Java.lang.String
どうすれば可能ですか?各オブジェクトはStringにキャストできますか?
コードは次のとおりです。
String myString = (String) myIntegerObject;
ありがとう。
これが不可能な理由:
文字列と整数は同じオブジェクト階層にないためです。
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();
いいえ。すべてのオブジェクトは、String
ではなく、Java.lang.Object
にキャストできます。オブジェクトの文字列表現が必要な場合は、toString()
メソッドを呼び出す必要があります。これはnotで、オブジェクトを文字列にキャストするのと同じです。
String
以外のString
に明示的にキャストすることはできません。次のいずれかを使用する必要があります。
"" + myInt;
または:
Integer.toString(myInt);
または:
String.valueOf(myInt);
私は2番目の形式を好みますが、個人的な選択だと思います。
編集 OK、2番目の形式を好む理由は次のとおりです。最初のフォームは、コンパイル時にStringBuffer
(Java 1.4で)またはStringBuilder
を1.5でインスタンス化できます。ガベージコレクトされるもう一つのこと。コンパイラは、私が知る限りこれを最適化しません。 2番目の形式には、Integer.toString(myInt, radix)
というアナログもあります。これにより、16進数、8進数などを指定できます。場所。
編集2整数がint
ではなくInteger
であると仮定した。すでにInteger
である場合は、toString()
を使用して完了です。
文字列表現が必要な場合は、myIntegerObject.toString()を呼び出す必要があります。
オブジェクトはtoString()
メソッドを使用してconverted文字列にできます:
String myString = myIntegerObject.toString();
castingについてのそのようなルールはありません。キャストが機能するためには、オブジェクトは実際にキャスト先のタイプである必要があります。
キャストは、非公式の用語を使用するためのJavaでの変換とは異なります。
オブジェクトをキャストするということは、そのオブジェクトが既にあなたがそれをキャストしようとしているものであることを意味し、あなたはそれをコンパイラーに伝えているだけです。たとえば、Foo
インスタンスであることがわかっているFooSubclass
参照がある場合、(FooSubclass)Foo
はコンパイラーに、「インスタンスを変更せず、実際にFooSubclass
であることがわかります」と伝えます。
一方、Integer
はnotString
ですが、(指摘したように)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 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;
実行時:スレッド「メイン」の例外Java.lang.ClassCastException:Java.lang.IntegerをJava.lang.Stringにキャストできません
代わりに以下のように.toStringを使用します。
String myString = myIntegerObject.toString();
String.valueOf(integer) を使用します。
整数の文字列表現を返します。