Come convertire CharSequence in stringa?


Risposte:


339

Invocando il suo toString()metodo.

Restituisce una stringa contenente i caratteri in questa sequenza nello stesso ordine di questa sequenza. La lunghezza della stringa sarà la lunghezza di questa sequenza.


@TheOnlyAnil, la chiamata setText(CharSequence)non fa quello che ti serve?
Mike Samuel,

Voglio rendere cliccabile il titolo di ActionBar.
TheOnlyAnil

@TheOnlyAnil, forse dovresti chiederlo come una domanda. I commenti su una risposta a una domanda tangenzialmente correlata non sono un buon posto per cercare di soddisfare le tue esigenze.
Mike Samuel,

Stackoverflow non mi consente di pubblicare alcuna domanda. : / a proposito l'ho fatto ieri sera. La barra delle azioni personalizzata è la soluzione :)
TheOnlyAnil

1
@WillByers che genera un output simile al toString di un array CharSequence, non a un CharSequence.
Mike Samuel,

90

C'è un problema sottile qui che è un po 'un gotcha.

Il toString()metodo ha un'implementazione di base in Object. CharSequenceè un'interfaccia; e sebbene il toString()metodo appaia come parte di quell'interfaccia, non c'è nulla in fase di compilazione che ti costringerà a sovrascriverlo e onorare i vincoli aggiuntivi che il CharSequence toString()javadoc del metodo pone sul toString()metodo; cioè che dovrebbe restituire una stringa contenente i caratteri nell'ordine restituito da charAt().

Il tuo IDE non ti aiuterà nemmeno ricordandoti che probabilmente dovresti scavalcare toString(). Ad esempio, in Intellij, questo è ciò che vedrai se crei una nuova CharSequenceimplementazione: http://puu.sh/2w1RJ . Si noti l'assenza di toString().

Se si fa affidamento su toString()un arbitrario CharSequence, dovrebbe funzionare a condizione che l' CharSequenceimplementatore abbia svolto correttamente il proprio lavoro. Ma se vuoi evitare qualsiasi incertezza, dovresti usare un StringBuildere append(), in questo modo:

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

9
Non dovresti fare errori / peggiorare il tuo codice perché altri potrebbero aver commesso un errore.
Lodewijk,

9
return new StringBuilder (charSequence) .toString (); è un equivalente singolo liner.
Gábor Lipták,

22
QUESTA RISPOSTA È ERRATA L' CharSequenceinterfaccia definisce esplicitamente toString(): l' implementatore non lo avrà perso. Il javadoc afferma "Restituisce una stringa contenente i caratteri in questa sequenza nello stesso ordine di questa sequenza. La lunghezza della stringa sarà la lunghezza di questa sequenza" sin dall'inizio in 1.4 . Gente, per favore verificate cosa avete
votato

2
Questo è sciocco. Se non ti fidi che l'implementatore segua il contratto, tutte le scommesse sono disattivate. Passarlo come parametro StringBuilderpotrebbe non riuscire a fare ciò che ti aspetti. Lo stesso vale per qualsiasi altra interfaccia, come Listo Set, in particolare, i loro equals()e hashCode()metodi che verranno compilati senza override, ma devono essere sostituiti in base al contratto.
shmosel,

3
Il fatto che l'interfaccia faccia questo è probabilmente una cattiva decisione a tale riguardo, e la mia risposta sottolinea semplicemente che questo è un luogo più facile del normale in cui si verificano errori umani.
Fragorl

19

Puoi usare direttamente String.valueOf ()

String.valueOf(charSequence)

Anche se questo è lo stesso come toString()fa un controllo nullo sul charSequenceprima di chiamare effettivamente a String.

Ciò è utile quando un metodo può restituire un valore charSequenceo null.


8
Questo in realtà mi ha appena morso oggi. se charSequenceè null, la stringa restituita sarà "null"e non null.
Chris Thomas Thomas

Oh. Ha senso. Rimuoverò questa risposta
Abhishek Batra

1
Penso che questo sia perfetto per alcuni casi.
Shukant Pal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.