Переопределение методов в классе
У меня есть следующее задание по учебе:
Класс AsciiCharSequence должен:
- Реализовывать интерфейс
java.lang.CharSequence. - Иметь конструктор, принимающий массив байт.
- Определять методы
length(),charAt(),subSequence()иtoString().
Я вроде бы сделал, что нужно, но возникают следующие проблемы:
- Игнорируется метод
toString() - Cannot resolve method
charAt(int) - Cannot resolve method
subSequence(int, int)
Подскажите пожалуйста, что я делаю не так?
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
byte[] example = {72, 101, 108, 108, 111, 33};
AsciiCharSequence answer = new AsciiCharSequence(example);
System.out.println("Последовательность - " + answer.toString());//Hello!
System.out.println("Размер её - " + answer.length());//6
System.out.println("Символ под № 1 - " + answer.charAt(1));//e
System.out.println("Подпоследовательность - " + answer.subSequence(1, 5));//ello
//проверка на нарушение инкапсуляции private поля
System.out.println(answer.toString());//Hello!
example[0] = 74;
System.out.println(answer.toString());//Hello!
}
public interface CharSequence {
int length();
char charAt(int s);
int subSequence(int start, int end);
}
public static class AsciiCharSequence implements CharSequence {
public byte[] b1;
public AsciiCharSequence(byte[] bytes) {
b1 = bytes;
}
@Override
public String toString() {
return Arrays.toString(b1);
}
public int subSequence(int start, int end) {
return b1.subSequence(start, end);
}
@Override
public int length() {
return b1.length;
}
@Override
public char charAt(int s) {
return b1.charAt(s);
}
}
}
Ответы (1 шт):
Во-первых, интерфейс java.lang.CharSequence и приведённый в коде интерфейс различаются. В частности, метод CharSequence::subSequence должен возвращать не целое число, как в представленном коде, а другую последовательность символов CharSequence:
CharSequence subSequence(int start, int end)
Returns aCharSequencethat is a subsequence of this sequence...
Отдельная проблема в том, что поле b1 в указанной реализации почему-то объявлено с общим доступом (public), что явно нарушает инкапсуляцию, и непонятно, почему после изменения содержимого массива example[0] = 74; ожидается вывод старой строки "Hello!", тогда как получится "Jello!".
Во-вторых, реализация метода toString при помощи Arrays.toString выведет содержимое массива в числовом виде ([72, 101, 108, 108, 111, 33]), тогда как по тесту явно предполагается, что требуется получить обычную строку, что легко выполнить при помощи конструктора new String(byte[] bytes).
В-третьих, для массива байтов b1 НЕ ОПРЕДЕЛЕНЫ методы subSequence и charAt, соответственно, возникают ошибки компиляции Cannot resolve method '%method_signature%':
CharSequence subSequence(int start, int end):
Для получения подпоследовательности можно использовать методArrays.copyOfRange(byte[] bytes, int from, int to), чтобы создать новый экземплярAsciiCharSequence.char charAt(int index)
Для получения символа из данного массива байтов достаточно обратиться к элементу массива по индексу, но при этом потребуется явное приведение полученного байта кchar.
Информации, приведённой в ответе, вполне достаточно для самостоятельной реализации класса AsciiCharSequence, который имплементирует стандартный интерфейс java.lang.CharSequence.