Як перетворити CharSequence в String?


Відповіді:


339

Посилаючись на його toString()метод.

Повертає рядок, що містить символи в цій послідовності в тому ж порядку, що і ця послідовність. Довжина рядка буде довжиною цієї послідовності.


@TheOnlyAnil, чи дзвінки setText(CharSequence)не роблять те, що потрібно?
Майк Самуель

Я хочу зробити заголовок actionBar клікабельним.
TheOnlyAnil

@TheOnlyAnil, можливо, ви повинні поставити це як питання. Коментарі до відповіді на дотично пов'язане питання - не вдале місце для спробу і дражнити ваші вимоги.
Майк Самуель

Stackoverflow не дозволить мені публікувати жодне запитання. : / btw Я це зробив минулої ночі. Користувацька панель дій - це рішення :)
TheOnlyAnil

1
@WillByers, який виводить, виглядає як toString масиву CharSequence, а не CharSequence.
Майк Самуель

90

Тут є тонка проблема, яка є дещо хиткою.

toString()Метод має базову реалізацію в Object. CharSequence- інтерфейс; і хоча toString()метод з'являється як частина цього інтерфейсу, в момент компіляції немає нічого, що змусить вас його перекрити і виконувати додаткові обмеження, які CharSequence toString()Javadoc методу накладає на toString()метод; тобто він повинен повернути рядок, що містить символи в порядку, поверненому charAt().

Ваш IDE навіть не допоможе вам, нагадуючи, що ви, ймовірно, повинні перекрити toString(). Наприклад, в Intellij це те, що ви побачите, якщо створити нову CharSequenceреалізацію: http://puu.sh/2w1RJ . Зверніть увагу на відсутність toString().

Якщо ви покладаєтесь на toString()довільне CharSequence, воно повинно працювати, якщо CharSequenceвиконавець виконав свою роботу належним чином. Але якщо ви хочете взагалі уникнути невизначеності, вам слід скористатися символом a StringBuilderі append(), таким чином:

final StringBuilder sb = new StringBuilder(charSequence.length());
sb.append(charSequence);
return sb.toString();

9
Ви не повинні робити помилки / погіршувати код, тому що, можливо, інші допустили помилку.
Lodewijk

9
повернути новий StringBuilder (charSequence) .toString (); є еквівалентом одного вкладиша.
Gábor Lipták

22
Ця відповідь НЕПРАВИЛЬНОCharSequence інтерфейс явно визначає toString()- реалізатор не пропустив це. У Javadoc стан «Повертає рядок , що містять символи в цій послідовності в тому ж порядку, що і цієї послідовності. Довжина рядка буде довжиною цієї послідовності» з моменту створення в 1.4 . Люди, будь ласка, перевірте, що Ви підтримуєте
earcam

2
Це нерозумно. Якщо ви не довіряєте виконавцеві виконувати договір, усі ставки знижуються. Передача його як параметр StringBuilderможе так само не виконати те, що ви очікуєте. Те ж саме стосується будь-якого іншого інтерфейсу, наприклад, Listабо Set, зокрема, їх equals()та hashCode()методів, які збиратимуться без змін, але повинні бути скасовані відповідно до договору.
shmosel

3
Те, що інтерфейс робить це, мабуть, є поганим рішенням у цьому відношенні, і моя відповідь просто підкреслює, що це легше, ніж зазвичай, місце людської помилки.
fragorl

19

Ви можете безпосередньо використовувати String.valueOf ()

String.valueOf(charSequence)

Хоча це те саме, що toString()він робить нульову перевірку charSequenceраніше, ніж насправді викликати toString.

Це корисно, коли метод може повернути charSequenceабо nullзначення, або значення.


8
Це насправді просто покусало мене сьогодні. якщо charSequenceнуль, то повернутий рядок буде, "null"а ні null.
ChrisThomas

Ой. Має сенс. Я вилучу цю відповідь
Абхішек Батра

1
Я думаю, що це ідеально підходить для деяких випадків.
Shukant Pal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.