Wie konvertiere ich CharSequence in String?

205

Wie kann ich ein Java CharSequencein ein konvertieren String?

Belgi
quelle

Antworten:

339

Durch Aufrufen seiner toString()Methode.

Gibt eine Zeichenfolge zurück, die die Zeichen in dieser Sequenz in derselben Reihenfolge wie diese Sequenz enthält. Die Länge der Zeichenfolge entspricht der Länge dieser Sequenz.

Mike Samuel
quelle
@TheOnlyAnil, macht das Anrufen setText(CharSequence)nicht das, was Sie brauchen?
Mike Samuel
Ich möchte den actionBar-Titel anklickbar machen.
TheOnlyAnil
@ TheOnlyAnil, vielleicht solltest du das als Frage stellen. Kommentare zu einer Antwort auf eine tangential verwandte Frage sind kein guter Ort, um Ihre Anforderungen herauszufiltern.
Mike Samuel
Mit Stackoverflow kann ich keine Frage stellen. : / Übrigens habe ich das letzte Nacht gemacht. Benutzerdefinierte Aktionsleiste ist die Lösung :)
TheOnlyAnil
1
@ WillByers Diese Ausgabe sieht aus wie der toString eines CharSequence-Arrays, nicht wie eine CharSequence.
Mike Samuel
90

Hier gibt es ein subtiles Problem, das ein bisschen wie ein Gotcha ist.

Die toString()Methode hat eine Basisimplementierung in Object. CharSequenceist eine Schnittstelle; und obwohl die toString()Methode als Teil dieser Schnittstelle angezeigt wird, gibt es zur Kompilierungszeit nichts, was Sie dazu zwingt, sie zu überschreiben und die zusätzlichen Einschränkungen CharSequence toString()zu berücksichtigen , die das Javadoc der Methode für die Methode auferlegt toString(). dh, dass es eine Zeichenfolge zurückgeben soll, die die Zeichen in der von zurückgegebenen Reihenfolge enthält charAt().

Ihre IDE hilft Ihnen nicht einmal, indem sie Sie daran erinnert, dass Sie sie wahrscheinlich überschreiben solltentoString() . In Intellij sehen Sie dies beispielsweise, wenn Sie eine neue CharSequenceImplementierung erstellen : http://puu.sh/2w1RJ . Beachten Sie das Fehlen von toString().

Wenn Sie sich auf toString()eine beliebige Version verlassen CharSequence, sollte diese funktionieren, sofern der CharSequenceImplementierer seine Arbeit ordnungsgemäß ausgeführt hat. Wenn Sie jedoch Unsicherheiten vermeiden möchten, sollten Sie ein StringBuilderund append()wie folgt verwenden:

final StringBuilder sb = new StringBuilder(charSequence.length());
sb.append(charSequence);
return sb.toString();
fragorl
quelle
9
Sie sollten keine Fehler machen / Ihren Code verschlechtern, da andere möglicherweise einen Fehler gemacht haben.
Lodewijk
9
neuen StringBuilder (charSequence) zurückgeben .toString (); ist ein Einzeileräquivalent.
Gábor Lipták
22
DIESE ANTWORT IST FALSCH Die CharSequenceSchnittstelle definiert explizit toString()- der Implementierer wird dies nicht übersehen haben. Im Javadoc heißt es "Gibt eine Zeichenfolge zurück, die die Zeichen in dieser Sequenz in derselben Reihenfolge wie diese Sequenz enthält. Die Länge der Zeichenfolge entspricht der Länge dieser Sequenz" seit Beginn in 1.4 . Leute, bitte überprüfen Sie, was Sie upvote
earcam
2
Das ist dumm. Wenn Sie dem Implementierer nicht vertrauen, dass er den Vertrag befolgt, sind alle Wetten ungültig. Die Übergabe als Parameter an StringBuilderkönnte genauso gut nicht das tun, was Sie erwarten. Gleiches gilt für alle anderen Schnittstellen wie Listoder Set, insbesondere deren equals()und hashCode()Methoden, die ohne Überschreibungen kompiliert werden, aber vertraglich überschrieben werden müssen .
Shmosel
3
Die Tatsache, dass die Schnittstelle dies tut, ist in dieser Hinsicht wohl eine schlechte Entscheidung, und meine Antwort hebt lediglich hervor, dass dies ein einfacher als normaler Ort für menschliches Versagen ist.
Fragorl
19

Sie können String.valueOf () direkt verwenden

String.valueOf(charSequence)

Dies ist jedoch dasselbe wie toString()eine Nullprüfung, charSequencebevor tatsächlich toString aufgerufen wird.

Dies ist nützlich, wenn eine Methode entweder a charSequenceoder nullvalue zurückgeben kann.

Abhishek Batra
quelle
8
Das hat mich heute eigentlich nur gebissen. Wenn charSequencenull ist, ist die zurückgegebene Zeichenfolge "null"und nicht null.
ChrisThomas
Oh. Macht Sinn. Ich werde diese Antwort entfernen
Abhishek Batra
1
Ich denke, das ist für einige Fälle perfekt.
Shukant Pal