2012-03-07 13 views
1

これは私がJavaで本当に理解したことのないものです。文字列に整数をキャストできないのはなぜですか?

int x = 4; 

今、私は今、私は変数x文字列を必要とする関数を渡すことはできません。この

functionThatRequiresString(x)またはfunctionThatRequiresString((String)x)

を行うことはできません:私が持っていると言うことができます。私はintから文字列にキャストすることもできません。今、これを行うための通常の方法は次のようになります。

Integer.toString(x)またはString.valueOf(x)

さて、なぜ私はこのかかわらを行うことができますか?

functionThatRequiresString(""+x)

これはどのように整数を文字列にキャストが異なるのですか?

+0

良い質問IMO。 –

答えて

3

キャストとは、コンパイラに「ここにタイプAのオブジェクトがありますが、それをタイプBのように扱いたいと思います」ということを意味します。エラーは表示されません。あなたにB "。

キャスティングではコンバージョンは行われません(少なくともプリミティブでないタイプではない)。プログラムを実行しているときに、オブジェクトが実際にタイプBでない場合、ClassCastExceptionが得られます。

intは、単にStringではありませんので、あなたはStringintをキャストすることはできません - あなたはそれがあることをふりをするようにコンパイラに伝えることができますが、プログラムを実行するときには、ClassCastExceptionを取得します。

(キャストされない)intからStringに変換します。ただ、私たちがコンパイルされたバイトコードを見ることができます完全性について

+0

ありがとう、私のキャスティングの理解は常にあなたがあるデータ型から別のデータ型に変換していたことでした。だから私はそれが定義の単純なことではないことを理解しています。 – Halfwarr

1

文字列にint型をキャストすることは、Javaでは単純にできません。式の中で:

functionThatRequiresString(""+x) 

キャストはありません。引数の1つがStringの場合、Stringを返す+演算子を呼び出します。

2

キャストには特定の意味があります。これは参照のタイプを変更しますが、参照されるオブジェクトのタイプや内容は変更しません。

""+xには、文字列にのみ関連する特定の使用例があります。この方法で他のデータ型に変換することはできません。

Javaには、オブジェクトのあるタイプから別のタイプへの「キャスト」という概念がありません。

+0

... "+" + xは、言語が設計されたときに、貧弱な決定であるとみなされる可能性があります。 –

+0

あなたは '' + x''を行うことができれば私には論理的だと思われますが、多くはあなたに同意します。 –

1

短い答えはStringintの親や子クラスではありませんので、あなたがStringからintをキャストすることができない。ありますキャストは、関連するさまざまなクラスのオブジェクトをどのように表示するかについてです。

あなたが本当に求めているのは、なぜJavaが自動的にはないのですか?をあなたのために変換しますか?

functionThatRequiresString(x)の答えと理由は、Javaがtype safeであり、正しい値の型をメソッドに渡すと主張しているからです。これは、関数に間違った型を渡しているバグを見つけるのが難しくなりますが、静かに正しい型に変換されているので、コンパイル時にコードをコンパイルしますが、実行時には非常に奇妙な動作をします。あなたが見てきたように、変換を実行したいときはあまり便利ではないという欠点があります。

"" + xが好きな理由は、これはコンパイラがすべての変換を処理する一般的な操作であるためです。明示的にStringを作成しているので、変換は安全です。

+0

+1ありがとうございました。キャスティングについての私の理解は、常にあるデータ型から別のデータ型に変換しているということでした。だから私はそれが定義の単純なことではないことを理解しています。 – Halfwarr

3

JDK 1.5.0_16(古代の私は知っているが、新しいのJDKは、私が思うに異なることはない)にコンパイルします使用
int i = 1; 
String s1 = "" + i; 
String s2 = Integer.toString(i); 

0: iconst_1 
    1: istore_1 
    2: new  #2; //class java/lang/StringBuilder 
    5: dup 
    6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 
    9: ldc  #4; //String 
    11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    14: iload_1 
    15: invokevirtual #6; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder; 
    18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    21: astore_2 
    22: iload_1 
    23: invokestatic #8; //Method java/lang/Integer.toString:(I)Ljava/lang/String; 
    26: astore_3 

あなたがs1 = "" + i"を使用しているときに、あなたが実際にやっていることは次のとおりです。

s1 = new StringBuilder().append("").append(i).toString(); 

(新しいオブジェクトを作成し、append(String)とそれに続くappend(int)メソッドを呼び出してStringBuilder)を文字列に変換します。

Integer.toString(int)などがより効率的です...

+0

"+" xが正確に何をするのか興味深いところをありがとう。 – Halfwarr

関連する問題