Как преобразовать строку в CharSequence?

265

Как конвертировать Stringв CharSequenceв Java?

Дакш Гаргас
источник
16
Вопрос вроде бессмысленный. Преобразование String в 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)
BlackEye
Вот как я бы посоветовал @JeffScottBrown перефразировать его комментарий: «Класс String реализует (IS-A) интерфейс CharSequence, чтобы вы могли передавать String вместо 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в a String, просто используйте toStringметод, который должен быть реализован каждой конкретной реализацией CharSequence.

Надеюсь, поможет.

Жоао Силва
источник
13
За исключением того, что вы не можете назначить CharSequencea Stringбез явного приведения.
gustafc
1
Исправил пример, спасибо. Я имел в виду обратное, то есть присвоить Stringa CharSequence.
Жоао Силва
4
Ты прав. Это действительно интерфейс. Тем не менее, этот код не создает экземпляр CharSequence. Он просто присваивает экземпляр Stringк CharSequenceпеременной, и так как Stringреализует CharSequenceинтерфейс, код работает.
Жоао Силва
5
Это не ответ. Вопрос это String -> to -> CharSequence. Ответ обратный.
Тран
3
Это отвечает обоим. Сначала Poster тривиально решает проблему String -> CharSequence, объясняя, что String - это CharSequence. Затем постер отвечает, как перейти от CharSequence к String.
Алекс А.
62

Прямой ответ:

String s = "Hello World!";

// String => CharSequence conversion:

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

CharSequenceэто интерфейс, а Stringкласс реализует CharSequence.

icza
источник
13

CharSequence - это интерфейс, а String - одна из реализаций, отличных от StringBuilder, StringBuffer и многих других.

Итак, так же, как вы используете InterfaceName i = new ItsImplementation(), вы можете использовать CharSequence cs = new String("string")или простоCharSequence cs = "string";

krmanish007
источник
3

Ты можешь использовать

CharSequence[] cs = String[] {"String to CharSequence"};
Лукас Фиальо
источник
8
Добро пожаловать в стек переполнения Лукас. Пожалуйста, предоставьте больше объяснений, чем фрагмент кода. Это может быть очевидно для нас, но помогите другим, сообщив им, почему этот код отвечает на вопрос.
Жан-Реми Реви
Заключение строки в массив не помогает понять, что String является CharSequence (и, следовательно, этот массив CharSequence является массивом String).
Тишма
1
CharSequence [] cs = new CharSequence [] {"String to CharSequence"};
Авес Радж
1

Попытка предоставить некоторый (возможный) контекст для вопроса ОП путем публикации моей собственной проблемы. Я работаю в Scala, но в сообщениях об ошибках я получаю все ссылочные типы Java, и сообщение об ошибке читается так же, как компилятор, жалующийся на то, что CharSequence не является String. Я подтвердил в исходном коде, что 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 и встроенным в Scala Iterable.

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

Моя конкретная проблема также может быть решена с помощью ответов в Scala: присоединить итерируемую строку

Таким образом, OP и другие, кто сталкивается с подобными проблемами, должны очень внимательно проанализировать сообщения об ошибках и посмотреть, какие преобразования типов могут быть задействованы.

Сара Мессер
источник