Javaで整数を文字列にキャストできないのはなぜですか?


95

私はいくつかの奇妙な例外を見つけました:

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

それはどのようにして可能ですか?各オブジェクトはStringにキャストできますか?

コードは次のとおりです。

String myString = (String) myIntegerObject;

ありがとう。


11
「各オブジェクトを文字列にキャストできます」 -これは誤りです。むしろ、すべてのオブジェクトには、toString()それを文字列に変換するメソッドがあります。いくつかの回答が指摘するように、それを使用する必要があります。(オブジェクトによってtoString()は、非常に便利な文字列を返さないものもありますが、の場合はInteger、おそらく望みどおりの結果を返します。)
Ted Hopp

2
""+myIntegerObjectも機能します:)
Salman von Abbas

1
私の場合、このエラーは誤って報告されました...私は使用Integer.toString(IntegerObject)していて、このエラーを出しましたが、満足していIntegerObject.toString()ます...そして、はい、それは本当に整数であり、私は本当にこのエラーを受け取りました...
アンドリュー

スクラッチ、String.valueOf()実際にのみ機能します...
Andrew

回答:


155

これが不可能な理由:

StringとIntegerは同じオブジェクト階層にないためです。

      Object
     /      \
    /        \
String     Integer

あなたが試みているキャスティングは、それらが同じ階層にある場合にのみ機能します、例えば

      Object
     /
    /
   A
  /
 /
B

この場合、(A) objBまたは(Object) objBまたは(Object) objA動作します。

したがって、他の人がすでに述べたように、整数を文字列に変換するには、次のようにします。

String.valueOf(integer)、またはInteger.toString(integer)プリミティブの場合、

または

Integer.toString() オブジェクトの。


(A)objA、(B)objB、(B)objAはどうですか?
su-ex

@ su-ex (B) objAは機能しません。(A) objAそして(B) objB動作します。
Bhushan 2016

すみません、そうです、これはClassCastExceptionを出します。他の2つはまったく役に立ちませんが、もちろん機能します。
su-ex

45

いいえ、IntegerおよびStringさまざまな種類があります。整数を文字列に変換するにはString.valueOf(integer)、またはInteger.toString(integer)、プリミティブ、またはInteger.toString()オブジェクトを使用します。


1
@テッド・ホップ-どれ?プリミティブの場合は最初の2つを使用し、Integerオブジェクトの場合は3番目を使用します。
Petar Minchev 2012年

おっとっと。あなたの答えの最後のフレーズは見当たりませんでした。コメントを削除して、この回答に賛成しています。
Ted Hopp

1
同様の(重複ではない)問題:「int」はオブジェクトではなく、文字列階層でははるかに少ないため、「int」を文字列にキャストできません
ケリーS.フランス語

20

以下のためintの型を使用します。

int myInteger = 1;
String myString = Integer.toString(myInteger);

以下のためIntegerの型を使用します。

Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();

これにより、不要なボックス化解除操作が強制されます。
Ted Hopp

@Ted Hoppが私の編集を見て、各タイプのtoString()メソッドをいつ使用するかを明確にします
DRiFTy

私は最後の行はそうあるべきだと思いますString myString = myIntegerObject.toString();
Ted Hopp '23

6

いいえ。すべてのオブジェクトはにキャストすることができjava.lang.Object、ありませんString。オブジェクトの文字列表現が必要な場合は、toString()メソッドを呼び出す必要があります。これは、オブジェクトを文字列にキャストすることと同じではありません


5

オブジェクトは、次のメソッドを使用して文字列に変換できますtoString()

String myString = myIntegerObject.toString();

キャストについてはそのようなルールはありません。キャストを機能させるには、オブジェクトが実際にキャスト先のタイプである必要があります。


5

あなたは明示的に何かをキャストすることはできませんStringではないというString。次のいずれかを使用する必要があります。

"" + myInt;

または:

Integer.toString(myInt);

または:

String.valueOf(myInt);

私は2番目の形式を好みますが、個人的な選択だと思います。

編集 OK、これが私が2番目のフォームを好む理由です。最初の形式は、コンパイル時にStringBuffer(Java 1.4の場合)またはStringBuilder1.5の場合をインスタンス化できます。ガベージコレクションのもう1つ。コンパイラは、私が知る限りこれを最適化しません。2番目のフォームにも類似点があり、Integer.toString(myInt, radix)16進数、8進数などを指定することができます。コードで一貫性を保ちたい場合(純粋に見た目は良いと思います)、2番目のフォームはより多くの場所で使用できます。

編集2私はあなたがあなたの整数がintでなくであることを意味すると仮定しましたInteger。すでにである場合はInteger、それを使用toString()して完了です。


OPはIntegerオブジェクトで始まります。ただ行う方がはるかに効率的ですmyIntegerObject.toString()
Ted Hopp


2

キャストは、Javaでの変換とは異なり、非公式の用語を使用します。

オブジェクトのキャストとは、そのオブジェクトが既にキャスト先であり、コンパイラーにそれを伝えているということです。たとえば、インスタンスであることがFooわかっている参照があるFooSubclass場合、(FooSubclass)Fooコンパイラに「インスタンスを変更しないでくださいFooSubclass。実際にはであることがわかります。

一方、はでIntegerはありませんString、(ご指摘のとおり)Stringを表すを取得するためのメソッドはありIntegerます。のインスタンスIntegerがになるStringことはないため、にキャストIntegerすることはできませんString


1

キャストが必要ない場合は、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にキャストできません



0

以下のように代わりに.toStringを使用してください:

String myString = myIntegerObject.toString();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.