web-dev-qa-db-ja.com

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

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

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

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

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

String myString = (String) myIntegerObject;

ありがとう。

91
user710818

これが不可能な理由:

文字列と整数は同じオブジェクト階層にないためです。

      Object
     /      \
    /        \
String     Integer

試みているキャストは、それらが同じ階層にある場合にのみ機能します。

      Object
     /
    /
   A
  /
 /
B

この場合、(A) objBまたは(Object) objBまたは(Object) objAが機能します。

したがって、他の人がすでに言及したように、整数を文字列に変換するには次を使用します:

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

または

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

143
Bhushan

いいえ、IntegerStringは異なるタイプです。整数を文字列に変換するには、String.valueOf(integer)、またはプリミティブのInteger.toString(integer)、またはオブジェクトのInteger.toString()を使用します。

45
Petar Minchev

intタイプの場合:

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

Integerタイプの場合:

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

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

6
andri

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()を使用して完了です。

5
Jonathan

文字列表現が必要な場合は、myIntegerObject.toString()を呼び出す必要があります。

4
Savino Sguera

オブジェクトはtoString()メソッドを使用してconverted文字列にできます:

String myString = myIntegerObject.toString();

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

4
millimoose

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

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

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

2
yshavit

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

1
Dmitry Sokolyuk

代わりに以下のように.toStringを使用します。

String myString = myIntegerObject.toString();
0
A.Aleem11

String.valueOf(integer) を使用します。

整数の文字列表現を返します。

0
RanRag