Розніца паміж ліццём для струнных і String.valueOf

У чым розніца паміж

Object foo = "something";
String bar = String.valueOf(foo);

і

Object foo = "something";
String bar = (String) foo;
73
Э-э, яны не тое ж самае ... на ўсіх.
дададзена аўтар Perception, крыніца

8 адказы

Кастынг нанізваць працуе толькі тады, калі аб'ект <�ет> на самой справе радок:

Object reallyAString = "foo";
String str = (String) reallyAString;//works.

Ён не будзе працаваць, калі аб'ект з'яўляецца нешта іншае:

Object notAString = new Integer(42);
String str = (String) notAString;//will throw a ClassCastException

String.valueOf() however will try to convert whatever you pass into it to a String. It handles both primitives (42) and objects (new Integer(42), using that object's 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"

Заўвага асабліва апошні прыклад: перадача нулявым у String.valueOf() вяртае радок "нуль" .

123
дададзена
Спрабаваў вул = String.valueOf (нуль) у Java 7 Update 80, ён выдае NullPointerException .
дададзена аўтар silver, крыніца
@Joachim Ці ёсць розніца ў прадукцыйнасці?
дададзена аўтар Adam Stelmaszczyk, крыніца
@AdamStelmaszczyk: Я сумняваюся, ці ёсць гэтае стаўленне. <�Я> Можа </я> ліццё трохі хутчэй, але і іншыя адрозненні (пагрузіў-нуль, здольнасць апрацоўваць іншыя тыпы) толькі <�я> значна </я> больш важныя, чым любая нязначная розніца ў прадукцыйнасці, што можа быць.
дададзена аўтар Joachim Sauer, крыніца
@Kevin: для спасылкавых тыпаў (a.k.a «аб'екты») розніца толькі ў тым, што адбываецца з Null . Калі вы паглядзіце на рэалізацыю String.valueOf() у JDK вы ўбачыце, што ўсё гэта робіцца для непустым спасылак з'яўляецца выклік ToString() .
дададзена аўтар Joachim Sauer, крыніца
@ShahidMZubair: добра, калі вы ведаеце, што аб'ект з'яўляецца Радок , то адліўка з'яўляецца правільным, што трэба зрабіць. Хоць гэта праўда, што String.valueOf (SomeString) мае той жа эфект, што і (String) SomeString (пры ўмове, вядома, што SomeString на самой справе адносіцца да а Радок ), але апошні больш выразна пра тое, што ён робіць. Таксама злепкі значна больш агульным, чым String.valueOf() : яны могуць быць зроблены з усімі, а не толькі радкі (ці не толькі радкоў). І апошняе, але, верагодна, не менш: літой не метад, гэта функцыя мовы. так што вы не можаце проста прынізіць яго (прынамсі, лёгка).
дададзена аўтар Joachim Sauer, крыніца
@silver: Насамрэч, я спрошчана. <�Код> String.valueOf ((Object) нуль) вяртае радок "нуль". Назваўшы яго з літары Null патэлефануе Радок # valueOf (сімвал []), які фактычна кідае NPE, калі вы перададзіце Null .
дададзена аўтар Joachim Sauer, крыніца
Для таго, каб вылучыць на гэтае пытанне крыху далей, ці ёсць істотная розніца паміж выклікам String.valueOf() і obj.toString() ? (Першае, што прыходзіць на розум, што obj.toString() будзе праз выключэнне, калі OBJ з'яўляецца пустым.)
дададзена аўтар Kevin, крыніца
@JoachimSauer Я заўсёды думаў, што String.valueOf() быў больш элегантна, чым літой. Але калі String.valueOf() робіць усё, што робіць ліццё, і многае іншае, ці існуюць якія-небудзь прычыны, чаму можна было б выбраць, каб выкарыстоўваць кідок? Чаму гэта не састарэла?
дададзена аўтар Shahid M Zubair, крыніца

String.valueOf(foo) invokes foo's .toString() method and assigns the result to the the bar. It is null and type safe operation.

Кастынг будзе проста прысвоіць <�моцны> Foo у бар , калі тыпы адпаведнасці. У адваротным выпадку, выраз кіне ClassCastException .

15
дададзена
+1 Для тлумачэння, што String.valueOf (Аб'ект) выклікае Object.toString()
дададзена аўтар Ryan Amos, крыніца

Абодва генеруе жа Выхад у выпадку Радок .

Casting fails in case of provided object is Not a string.

3
дададзена

Кастынг азначае, што аб'ект павінен быць тыпу String, у той час як String.valueOf() можа прымаць іншыя тыпы, а таксама.

2
дададзена

Метад String.valueOf выкарыстоўваецца для атрымання радкі represenation ад яго аб'екта параметру.

Значэнне (String) адкідвае значэнне аб'екта ў радок.

Вы можаце выкарыстоўваць метад String.valueOf, каб атрымаць радковае ўяўленне аб'екта, не клапоцячыся пра нулявых спасылках. Калі вы спрабуеце кінуць радок на нулявую спасылцы вы атрымаеце NullPointerException.

2
дададзена
<�Папярэдне> канчатковы аб'ект OBJ = NULL; Канчатковы Радок strValOfObj = String.valueOf (OBJ); Канчатковы Радок strCastOfObj = (радок) OBJ; калі (strValOfObj == NULL) System.out.println ( "strValOfObj роўная нуля"); калі (strCastOfObj == NULL) System.out.println ( "strCastOfObj роўная нуля");

Output: strCastOfObj is null

1
дададзена

Першы г.зн., String.valueOf вяртае радок, толькі калі аб'ект з'яўляецца прадстаўляльныя тыпу, які з'яўляецца тыпам значэння або радок .. Інакш ён выкідвае выключэнне.

У апошнім адным, вы непасрэдна кастынг, які можа не спрацаваць, калі аб'ект не з'яўляецца радком.

Інтэрнэт прыклад.

http://ideone.com/p7AGh5

0
дададзена
Які тып выключэння?
дададзена аўтар Yousha Aleayoub, крыніца

у String.valueOf (); Радок у працы тыпажоў ўсе аргумент, што перадаецца ў valueof() метад пераўтварэнні ў String, і гэтак жа, як integer.string() пераўтворыць лік у радок толькі

0
дададзена