Jak przekonwertować ciąg na CharSequence?

265

Jak przekonwertować Stringna CharSequencew Javie?

Daksh Gargas
źródło
16
Pytanie jest trochę nie sensowne. Konwersja stringu na charSequence jest jak konwersja fletu na instrument muzyczny. Łańcuch jest już CharSequence. Klasa String implementuje interfejs CharSequence.
Jeff Scott Brown
3
Zamieszanie OP może wynikać z niewiedzy, co to znaczy zaprogramować interfejs
Raedwald
9
@JeffScottBrown pytanie faktycznie ma sens, jest uzasadnionym cudem dla każdego, kto czyta przez dokument Android lub Java i nie zauważa, że ​​CharSequence nie jest klasą. Twój komentarz pomógł mi, ale gdyby pytanie nie zostało sformułowane w ten sposób, nie znalazłbym go i spędziłbym więcej czasu na szukaniu odpowiedzi, niż jest to naprawdę warte;)
Kheldar
Do tego pytania doszedłem w kontekście groovy Problem: Exception groovy.lang.MissingMethodException: No signature of method: static java.util.regex.Pattern.matcher() is applicable for argument types: (java.lang.String)
BlackEye
Oto jak radzę @JeffScottBrown przeredagować jego komentarz: „Klasa String implementuje (IS-A) interfejs CharSequence, abyś mógł przekazać String zamiast CharSequence. To tak, jakbyś mógł nazwać flet jako instrument muzyczny, ponieważ flet IS-A instrument muzyczny ”
Vighnesh

Odpowiedzi:

261

Od String IS-A CharSequence możesz przekazać Stringgdziekolwiek potrzebujesz CharSequencelub przypisać a Stringdo CharSequence:

CharSequence cs = "string";
String s = cs.toString();
foo(s); // prints "string"

public void foo(CharSequence cs) { 
  System.out.println(cs);
}

Jeśli chcesz przekonwertować CharSequencena a String, po prostu użyj toStringmetody, która musi być zaimplementowana przy każdej konkretnej implementacji CharSequence.

Mam nadzieję, że to pomoże.

João Silva
źródło
13
Tyle, że nie można przypisać CharSequencedo a Stringbez jawnej obsady.
gustafc
1
Naprawiono przykład, dzięki. Miałem na myśli odwrotnie, tj. Przypisać a Stringdo CharSequence.
João Silva
4
Masz rację. To rzeczywiście interfejs. Jednak ten kod nie tworzy wystąpienia CharSequence. To po prostu przypisuje wystąpienie Stringdo CharSequencezmiennej, a ponieważ Stringimplementuje CharSequenceinterfejs, działa kod.
João Silva
5
To nie jest odpowiedź. Pytanie brzmi: String -> to -> CharSequence. Odpowiedź jest odwrotna.
trante
3
To odpowiada na oba. Plakat najpierw w trywialny sposób rozwiązuje problem String -> CharSequence, wyjaśniając, że String IS CharSequence. Następnie plakat odpowiada, jak przejść z CharSequence do String.
Alex A.,
62

Prosta odpowiedź:

String s = "Hello World!";

// String => CharSequence conversion:

CharSequence cs = s;  // String is already a CharSequence

CharSequencejest interfejsem, a Stringklasa implementuje CharSequence.

icza
źródło
13

CharSequence to interfejs, a String jest jedną z implementacji innych niż StringBuilder, StringBuffer i wiele innych.

Tak, jak używasz InterfaceName i = new ItsImplementation(), możesz używać CharSequence cs = new String("string")lub po prostuCharSequence cs = "string";

krmanish007
źródło
3

Możesz użyć

CharSequence[] cs = String[] {"String to CharSequence"};
Lucas Fialho
źródło
8
Witamy w Stack Overflow Lucas. Podaj więcej wyjaśnień niż fragment kodu. Może to być dla nas oczywiste, ale pomóż innym, informując ich, dlaczego ten kod odpowiada na pytanie.
Jean-Rémy Revy
Zawijanie łańcucha do tablicy nie pomaga w stwierdzeniu, że String jest CharSequence (a zatem tablica CharSequence jest tablicą String).
tishma
1
CharSequence [] cs = new CharSequence [] {"String to CharSequence"};
avez raj
1

Próba zapewnienia pewnego (możliwego) kontekstu dla pytania OP poprzez opublikowanie własnych problemów. Pracuję w Scali, ale komunikaty o błędach otrzymuję wszystkie referencyjne typy Java, a komunikat o błędzie brzmi podobnie jak kompilator narzekający, że CharSequence nie jest ciągiem . Potwierdziłem w kodzie źródłowym, że String implementuje interfejs CharSequence, ale komunikat o błędzie zwraca uwagę na różnicę między String a CharSequence, ukrywając prawdziwe źródło problemu:

scala> cols
res8: Iterable[String] = List(Item, a, b)

scala> val header = String.join(",", cols)
<console>:13: error: overloaded method value join with alternatives:
  (x$1: CharSequence,x$2: java.lang.Iterable[_ <: CharSequence])String <and>
  (x$1: CharSequence,x$2: CharSequence*)String
 cannot be applied to (String, Iterable[String])
       val header = String.join(",", cols)

Byłem w stanie rozwiązać ten problem, wiedząc, że nie chodzi o String / CharSequence, ale raczej o niezgodność między java.lang.Iterable i wbudowaną Iterable Scali.

scala> val header = String.join(",", coll: _*)
header: String = Item,a,b

Mój szczególny problem można również rozwiązać za pomocą odpowiedzi w Scali: dołącz do iterowalnego ciągu znaków

Podsumowując, OP i inni, którzy napotykają podobne problemy, powinni bardzo dokładnie przeanalizować komunikaty o błędach i zobaczyć, jakie konwersje innego typu mogą być związane.

Sarah Messer
źródło