Comment convertir CharSequence en chaîne?

205

Comment puis-je convertir un Java CharSequenceen un String?

Belgi
la source

Réponses:

339

En invoquant sa toString()méthode.

Renvoie une chaîne contenant les caractères de cette séquence dans le même ordre que cette séquence. La longueur de la chaîne sera la longueur de cette séquence.

Mike Samuel
la source
@TheOnlyAnil, l'appel setText(CharSequence)ne fait-il pas ce dont vous avez besoin?
Mike Samuel
Je veux rendre le titre actionBar cliquable.
TheOnlyAnil
@TheOnlyAnil, vous devriez peut-être poser cette question. Les commentaires sur une réponse à une question tangentielle ne sont pas un bon endroit pour essayer de répondre à vos besoins.
Mike Samuel
Stackoverflow ne me laisse pas poster de question. : / btw je l'ai fait hier soir. La barre d'action personnalisée est la solution :)
TheOnlyAnil
1
@WillByers dont la sortie ressemble à la toString d'un tableau CharSequence, pas à une CharSequence.
Mike Samuel
90

Il y a un problème subtil ici qui est un peu un piège.

La toString()méthode a une implémentation de base dans Object. CharSequenceest une interface; et bien que la toString()méthode apparaisse dans le cadre de cette interface, rien au moment de la compilation ne vous obligera à la remplacer et à respecter les contraintes supplémentaires que CharSequence toString()javadoc de la toString()méthode impose à la méthode; c'est-à-dire qu'il doit retourner une chaîne contenant les caractères dans l'ordre retourné par charAt().

Votre IDE ne vous aidera même pas en vous rappelant que vous devriez probablement passer outre toString(). Par exemple, dans intellij, c'est ce que vous verrez si vous créez une nouvelle CharSequenceimplémentation: http://puu.sh/2w1RJ . Notez l'absence detoString() .

Si vous comptez sur toString()un arbitraire CharSequence, cela devrait fonctionner à condition que l' CharSequenceimplémenteur ait fait son travail correctement. Mais si vous voulez éviter toute incertitude, vous devez utiliser un StringBuilderet append(), comme ceci:

final StringBuilder sb = new StringBuilder(charSequence.length());
sb.append(charSequence);
return sb.toString();
fragorl
la source
9
Vous ne devriez pas faire d'erreurs / aggraver votre code car d'autres pourraient avoir fait une erreur.
Lodewijk
9
renvoie un nouveau StringBuilder (charSequence) .toString (); est un équivalent de doublure simple.
Gábor Lipták
22
CETTE RÉPONSE EST FAUX L' CharSequenceinterface définit explicitement toString()- l' implémenteur ne l'aura pas manqué. Le javadoc déclare "Renvoie une chaîne contenant les caractères de cette séquence dans le même ordre que cette séquence. La longueur de la chaîne sera la longueur de cette séquence" depuis sa création en 1.4 . Les gens, veuillez vérifier ce que vous votez
earcam
2
C'est idiot. Si vous ne faites pas confiance à l'implémentateur pour suivre le contrat, tous les paris sont désactivés. Le passer en tant que paramètre à StringBuilderpourrait tout aussi bien ne pas faire ce que vous attendez. Il en va de même pour toute autre interface, telle que Listou Set, en particulier leur equals()et les hashCode()méthodes qui seront compilées sans dérogation, mais qui doivent être remplacées conformément au contrat.
shmosel
3
Le fait que l'interface fasse cela est sans doute une mauvaise décision à cet égard, et ma réponse souligne simplement que c'est un endroit plus facile que la normale pour qu'une erreur humaine se produise.
fragorl
19

Vous pouvez directement utiliser String.valueOf ()

String.valueOf(charSequence)

Bien que cela soit le même que toString()pour une vérification nulle sur charSequenceavant d'appeler réellement toString.

Ceci est utile lorsqu'une méthode peut renvoyer une valeur charSequenceou null.

Abhishek Batra
la source
8
En fait, cela m'a juste mordu aujourd'hui. si charSequenceest nul alors la chaîne retournée sera "null"et non null.
ChrisThomas
Oh. Logique. Je supprimerai cette réponse
Abhishek Batra
1
Je pense que c'est parfait pour certains cas.
Shukant Pal