Как конвертировать CharSequence в строку?


Ответы:


339

Призывая его toString()метод.

Возвращает строку, содержащую символы в этой последовательности в том же порядке, что и эта последовательность. Длина строки будет длиной этой последовательности.


@TheOnlyAnil, звонки setText(CharSequence)не делают то, что вам нужно?
Майк Сэмюэль

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

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

Stackoverflow не позволит мне опубликовать любой вопрос. : / Кстати, я сделал это прошлой ночью. Пользовательская панель действий - это решение :)
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 (); является эквивалентом одного лайнера.
Габор Липтак

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

2
Это глупо. Если вы не доверяете исполнителю выполнить договор, все ставки сняты. Передача этого параметра в качестве параметра также StringBuilderможет не дать ожидаемого результата. То же самое касается любого другого интерфейса, такого как Listили Set, в частности их equals()и hashCode()методы, которые будут компилироваться без переопределений, но должны быть переопределены в соответствии с контрактом.
шмосел

3
Тот факт, что интерфейс делает это, возможно, является плохим решением в этом отношении, и мой ответ просто подчеркивает, что это более легкое, чем обычно, место возникновения человеческой ошибки.
Fragorl

19

Вы можете напрямую использовать String.valueOf ()

String.valueOf(charSequence)

Хотя это то же самое, toString()что и проверка на null charSequenceперед фактическим вызовом toString.

Это полезно, когда метод может возвращать либо значение, charSequenceлибо nullзначение.


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

Ой. Имеет смысл. Я уберу этот ответ
Абхишек Батра

1
Я думаю, что это идеально подходит для некоторых случаев.
Шукант Пал
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.