Як перетворити рядок у 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.