違いは何ですか
Object foo = "something";
String bar = String.valueOf(foo);
そして
Object foo = "something";
String bar = (String) foo;
回答:
文字列へのキャストは、オブジェクトが実際に文字列である場合にのみ機能します。
Object reallyAString = "foo";
String str = (String) reallyAString; // works.
オブジェクトが他のものである場合は機能しません。
Object notAString = new Integer(42);
String str = (String) notAString; // will throw a ClassCastException
String.valueOf()
ただし、渡したものはすべてに変換しようとしますString
。プリミティブ(42
)とオブジェクト(new Integer(42)
、そのオブジェクトを使用)の両方を処理しますtoString()
。
String str;
str = String.valueOf(new Integer(42)); // str will hold "42"
str = String.valueOf("foo"); // str will hold "foo"
Object nullValue = null;
str = String.valueOf(nullValue); // str will hold "null"
特に最後の例に注意してください。に渡すnull
とString.valueOf()
文字列が返されます"null"
。
String.valueOf()
との間に大きな違いはありobj.toString()
ますか?(最初に頭に浮かぶのは、nullのobj.toString()
場合obj
は例外が発生することです。)
null
。で何が起こるかです。String.valueOf()
JDKでのの実装を見ると、null以外の参照に対して行うのはを呼び出すことだけであることがわかりますtoString()
。
String.valueOf()
キャストよりもエレガントだと思っていました。しかしString.valueOf()
、キャスティングが行うすべてのこと、そしてそれ以上のことを行うのであれば、キャストを使用することを選択する理由はありますか?なぜ非推奨にならなかったのですか?
String.valueOf((Object) null)
文字列「null」を返します。リテラルnull
を使用して呼び出すと、String#valueOf(char [])が呼び出され、を渡すと実際にNPEがスローされnull
ます。
String.valueOf(foo)
fooの.toString()
メソッドを呼び出し、結果をバーに割り当てます。これはnullであり、タイプセーフな操作です。
タイプが一致している場合、キャストはfooをバーに割り当てるだけです。それ以外の場合、式はClassCastException
。をスローします。
String.valueOf(Object)
呼び出すことを説明するためにObject.toString()
の場合、どちらも同じ出力を生成しますString
。
Casting
提供されたオブジェクトがではない場合は失敗します string.
最初のもの、すなわち、 String.valueOf
は、オブジェクトが値型または文字列である表現可能な型である場合にのみ文字列を返します。それ以外の場合は、例外をスローします。
後者では、直接キャストしていますが、オブジェクトが文字列でない場合は失敗する可能性があります。
オンラインの例。
String.valueOf(); valueof()メソッドで渡されたすべての引数を型キャストする作業としての文字列は文字列に変換され、integer.string()と同様に整数を文字列のみに変換します