Як перетворити рядок у CharSequence?


265

Як перетворитись Stringна CharSequenceJava?


16
Питання є нетиповим. Перетворення струни в CharSequence - це як перетворення флейти на музичний інструмент. Рядок вже є CharSequence. Клас String реалізує інтерфейс CharSequence.
Джефф Скотт Браун

3
Плутанина ОП може випливати з того, що не знати, що означає програмувати на інтерфейс
Raedwald

9
@JeffScottBrown питання насправді має сенс, це правомірне диво для тих, хто читає документ Android або Java і пропускає деталі, що CharSequence не є класом. Ваш коментар мені допоміг, але якби питання було не сформульовано таким, яким воно є, я б його не знайшов і витратив би більше часу на пошуки відповіді, ніж це насправді варто;)
Хельдар,

Я прийшов до цього питання в контексті Exception groovy.lang.MissingMethodException: No signature of method: static java.util.regex.Pattern.matcher() is applicable for argument types: (java.lang.String)
бурхливої

Ось як я порадив @JeffScottBrown переробити його коментар - "Клас String реалізує (IS-A) інтерфейс CharSequence, щоб ви могли передавати рядок замість CharSequence. Це як би ви могли відноситись до флейти як до музичний інструмент, тому що флейта IS-A музичний інструмент "
Vighnesh

Відповіді:


261

Оскільки String IS-A CharSequence , ви можете передати Stringтуди, де вам потрібно CharSequence, або призначити Stringйого CharSequence:

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

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

Якщо ви хочете перетворити a CharSequenceв String, просто використовуйте toStringметод, який повинен бути реалізований кожною конкретною реалізацією CharSequence.

Сподіваюся, це допомагає.


13
За винятком того, що ви не можете призначити CharSequencea Stringбез явного складу.
gustafc

1
Виправлений приклад, дякую. Я мав на увазі навпаки, тобто призначити Stringа CharSequence.
Жоао Сільва

4
Ви праві. Це справді інтерфейс. Однак цей код не позначає а CharSequence. Він просто привласнює екземпляр Stringдо CharSequenceзмінної, і так як Stringреалізує CharSequenceінтерфейс, код працює.
Жоао Сільва

5
Це не відповідь. Питання - String -> to -> CharSequence. Відповідь зворотний.
trante

3
Це відповідає обом. Плакат спочатку тривіально вирішує проблему String -> CharSequence, пояснюючи, що String IS CharSequence. Потім плакат відповідає, як пройти від CharSequence до String.
Олексій А.

62

Пряма відповідь:

String s = "Hello World!";

// String => CharSequence conversion:

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

CharSequenceє інтерфейсом, і Stringклас реалізує CharSequence.


13

CharSequence - це інтерфейс, а String - це одна з його реалізацій, крім StringBuilder, StringBuffer та багатьох інших.

Отже, так само, як ви користуєтесь InterfaceName i = new ItsImplementation(), ви можете використовувати CharSequence cs = new String("string")або простоCharSequence cs = "string";


3

Можна використовувати

CharSequence[] cs = String[] {"String to CharSequence"};

8
Ласкаво просимо до Stack Overflow Lucas. Надайте більше пояснень, ніж фрагмент коду. Для нас це може бути очевидно, але допоможіть іншим, даючи їм знати, чому цей код відповідає на питання.
Жан-Ремі Реві

Встановлення рядка в масив не допомагає зробити точку, що String є CharSequence (і, отже, цей масив CharSequence є масивом String).
тишма

1
CharSequence [] cs = new CharSequence [] {"Рядок до CharSequence"};
avez raj

1

Спроба надати певний (можливий) контекст для питання ОП, розміщуючи власну проблему. Я працюю в Scala, але повідомлення про помилки я отримую всі типові Java-повідомлення, і повідомлення про помилку багато читає, як компілятор, нарікаючи, що CharSequence не є рядком. У вихідному коді я підтвердив, що String реалізує інтерфейс CharSequence, але повідомлення про помилку привертає увагу до різниці між String та CharSequence, приховуючи реальне джерело проблеми:

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)

Мені вдалося виправити цю проблему, усвідомивши, що проблема була не String / CharSequence, а скоріше невідповідністю між java.lang.Iterable та вбудованим Iterable Scala.

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

Мою конкретну проблему також можна вирішити за допомогою відповідей у Scala: приєднайтеся до ітерабельного рядка

Підсумовуючи, ОП та інші, хто стикається з подібними проблемами, повинні дуже детально проаналізувати повідомлення про помилки та побачити, які можуть бути пов'язані перетворення інших типів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.