Jak przekonwertować CharSequence na String?

Odpowiedzi:

339

Przywołując jego toString()metodę.

Zwraca ciąg znaków zawierający znaki w tej sekwencji w tej samej kolejności co ta sekwencja. Długość łańcucha będzie długością tej sekwencji.

Mike Samuel
źródło
@TheOnlyAnil, czy dzwonienie setText(CharSequence)nie robi tego, czego potrzebujesz?
Mike Samuel
Chcę, aby tytuł ActionBar był klikalny.
TheOnlyAnil
@TheOnlyAnil, może powinieneś zadać to pytanie. Komentarze do odpowiedzi na stycznie powiązane pytanie nie są dobrym miejscem do wypróbowania swoich wymagań.
Mike Samuel
Stackoverflow nie pozwala mi pisać żadnych pytań. : / btw Zrobiłem to ostatniej nocy. Rozwiązaniem jest niestandardowy pasek akcji :)
TheOnlyAnil
1
@WillByers, które generują dane wyjściowe, wygląda jak toString tablicy CharSequence, a nie CharSequence.
Mike Samuel,
90

Jest tutaj subtelna kwestia, która jest trochę gotcha.

toString()Metoda ma implementację w bazie Object. CharSequencejest interfejsem; i chociaż toString()metoda pojawia się jako część tego interfejsu, w czasie kompilacji nie ma niczego, co zmusiłoby cię do zastąpienia jej i przestrzegania dodatkowych ograniczeń, które CharSequence toString()javadoc narzuca na toString()metodę; tzn. powinien zwrócić ciąg zawierający znaki w kolejności zwracanej przez charAt().

Twoje IDE nawet ci nie pomoże, przypominając, że prawdopodobnie powinieneś to zmienić toString(). Na przykład w intellij zobaczysz to, jeśli utworzysz nową CharSequenceimplementację: http://puu.sh/2w1RJ . Zwróć uwagę na brak toString().

Jeśli polegasz na toString()arbitralności CharSequence, powinien on działać, pod warunkiem, że CharSequencerealizator wykonał swoją pracę poprawnie. Ale jeśli chcesz całkowicie uniknąć jakiejkolwiek niepewności, powinieneś użyć StringBuildera append(), i tak:

final StringBuilder sb = new StringBuilder(charSequence.length());
sb.append(charSequence);
return sb.toString();
fragorl
źródło
9
Nie powinieneś popełniać błędów / pogarszać kodu, ponieważ inni mogli popełnić błąd.
Lodewijk
9
zwraca nowy StringBuilder (charSequence) .toString (); jest ekwiwalentem jednej liniowej.
Gábor Lipták
22
Ta odpowiedź jest błędnaCharSequence interfejs wyraźnie określa toString()- w implementor nie będzie brakowało tego. W JavaDoc stwierdza: „Zwraca ciąg zawierający znaki w tej kolejności, w tej samej kolejności co tej sekwencji. Długość łańcucha będzie długość tej sekwencji” od powstania w 1.4 . Ludzie, sprawdźcie, co głosujecie
kamera douszna
2
To jest głupie. Jeśli nie ufasz, że realizator dotrzyma umowy, wszystkie zakłady są wyłączone. Przekazanie go jako parametru StringBuildermoże równie dobrze nie spełnić oczekiwań. To samo dotyczy każdego innego interfejsu, takiego jak Listlub Set, w szczególności ich equals()i hashCode()metod, które będą kompilowane bez zastąpień, ale muszą zostać zastąpione zgodnie z umową.
shmosel
3
Fakt, że interfejs to robi, jest prawdopodobnie złą decyzją w tym względzie, a moja odpowiedź po prostu podkreśla, że ​​jest to łatwiejsze niż normalnie miejsce na wystąpienie błędu ludzkiego.
fragorl
19

Możesz bezpośrednio użyć String.valueOf ()

String.valueOf(charSequence)

Chociaż jest to to samo, co toString()sprawdzanie wartości zerowej charSequenceprzed faktycznym wywołaniem funkcjiString.

Jest to przydatne, gdy metoda może zwrócić wartość a charSequencelub null.

Abhishek Batra
źródło
8
To właśnie mnie dzisiaj ugryzło. jeśli charSequencejest null, wówczas zwracany ciąg będzie "null"i nie będzie null.
ChrisThomas
O. Ma sens. Usunę tę odpowiedź
Abhishek Batra
1
Myślę, że jest to idealne w niektórych przypadkach.
Shukant Pal