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.


@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();

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.