Как преобразовать CharSequence в строку в Java?
Как я могу конвертировать Java CharSequence
к String
?
6 ответов
Ссылаясь на его toString()
метод.
Возвращает строку, содержащую символы в этой последовательности в том же порядке, что и эта последовательность. Длина строки будет длиной этой последовательности.
Здесь есть тонкая проблема, которая немного напоминает.
toString()
Метод имеет базовую реализацию в Object
, CharSequence
это интерфейс; и хотя toString()
Метод появляется как часть этого интерфейса, во время компиляции нет ничего, что заставило бы вас переопределить его и соблюдать дополнительные ограничения, которые CharSequence
toString()
Javadoc метода ставит на toString()
Способ; т.е. что он должен возвращать строку, содержащую символы в порядке, возвращаемом charAt()
,
Ваша IDE даже не поможет вам, напомнив, что вы, вероятно, должны переопределить toString()
, Например, в intellij это то, что вы увидите, если создадите новый CharSequence
реализация: http://puu.sh/2w1RJ. Обратите внимание на отсутствие toString()
,
Если вы полагаетесь на toString()
на произвольном CharSequence
, он должен работать при условии CharSequence
исполнитель сделал свою работу правильно. Но если вы хотите избежать какой-либо неопределенности в целом, вы должны использовать StringBuilder
а также append()
, вот так:
final StringBuilder sb = new StringBuilder(charSequence.length());
sb.append(charSequence);
return sb.toString();
Вы можете напрямую использовать String.valueOf()
String.valueOf(charSequence)
Хотя это так же, как toString()
он делает нулевую проверку на charSequence
перед тем, как на самом деле вызвать toString.
Это полезно, когда метод может вернуть либо charSequence
или же null
значение.
Самый безопасный путь
String string = String.valueOf(charSequence);
Давай нырнем глубже
Есть 3 способа, которыми мы можем попытаться преобразовать a в:
- Тип литья :
String string = (String) charSequence;
- Звонок :
String string = charSequence.toString();
- Метод :
String string = String.valueOf(charSequence);
И если мы запустим их, где
CharSequence charSequence = "a simple string";
тогда все 3 из них дадут ожидаемый результат.
Проблема возникает, когда мы не уверены в природе файла. Фактически, это
interface
что несколько других классов реализуют, например,
CharBuffer
,
StringBuffer
и т. д. Таким образом, преобразование a в a - это простая операция присваивания, никакого преобразования или чего-либо еще не требуется. Но для противоположного, Upcasting, это не так.
Если мы уверены, что это действительно объект
String
, только тогда мы можем использовать вариант 1 - Типовое приведение . В противном случае мы получим
ClassCastException
. Варианты 2 и 3 в этом случае безопасны.
С другой стороны, если выбран вариант 2, Вызов , будет
NullPointerException
.
Теперь внутри метод вызывает
toString()
после проверки. Итак, это самый безопасный способ. JavaDoc:
если аргумент равен нулю, тогда строка равна нулю; в противном случае возвращается значение obj.toString().
Имейте в виду: если
CharSequence
затем
String.valueOf()
метод возвращает строку
"null"
, а не
null
значение .
Если вы хотите преобразовать массив CharSequence, вы можете просто сделать это, а также сохранить его в переменной String[].
CharSequence[] textMsgs = (CharSequence[])sbm.getNotification().extras.get(Notification.EXTRA_TEXT_LINES);
if (textMsgs != null) {
for (CharSequence msg : textMsgs) {
Log.e("Msg", msg.toString());
}
}
Также вы можете использовать Stringbuilder.
new StringBuilder(charSequence).toString();