CharSequence
A CharSequence
- это интерфейс, а не фактический класс. Интерфейс - это просто набор правил (методов), которые должен содержать класс, если он реализует интерфейс. В Android CharSequence
- это зонтик для различных типов текстовых строк. Вот некоторые из распространенных:
(Вы можете узнать больше о различиях между этими здесь .)
Если у вас есть объект CharSequence
, то это фактически объект одного из классов, реализующих CharSequence
. Например:
CharSequence myString = "hello";
CharSequence mySpannableStringBuilder = new SpannableStringBuilder();
Преимущество общего типа зонта, например CharSequence
, заключается в том, что вы можете обрабатывать несколько типов одним методом. Например, если у меня есть метод, который принимает CharSequence
в качестве параметра, я мог бы передать String
или SpannableStringBuilder
, и он обработал бы либо один.
public int getLength(CharSequence text) {
return text.length();
}
Строка
Можно сказать, что String
- это всего лишь один вид CharSequence
. Однако, в отличие от CharSequence
, это фактический класс, поэтому из него можно создавать объекты. Чтобы вы могли сделать это:
String myString = new String();
но вы не можете сделать это:
CharSequence myCharSequence = new CharSequence(); // error: 'CharSequence is abstract; cannot be instantiated
Поскольку CharSequence
- это просто список правил, которым String
соответствует, вы можете сделать это:
CharSequence myString = new String();
Это означает, что всякий раз, когда метод запрашивает CharSequence
, можно присвоить ему String
.
String myString = "hello";
getLength(myString); // OK
// ...
public int getLength(CharSequence text) {
return text.length();
}
Однако обратное неверно. Если метод принимает параметр String
, вы не можете передать ему что-то, что, как обычно известно, является CharSequence
, потому что это может быть SpannableString
или какой-то другой тип CharSequence
.
CharSequence myString = "hello";
getLength(myString); // error
// ...
public int getLength(String text) {
return text.length();
}