Переопределение методов в классе

У меня есть следующее задание по учебе:

Класс AsciiCharSequence должен:

  1. Реализовывать интерфейс java.lang.CharSequence.
  2. Иметь конструктор, принимающий массив байт.
  3. Определять методы length(), charAt(), subSequence() и toString().

Я вроде бы сделал, что нужно, но возникают следующие проблемы:

  1. Игнорируется метод toString()
  2. Cannot resolve method charAt(int)
  3. 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 шт):

Автор решения: Nowhere Man

Во-первых, интерфейс java.lang.CharSequence и приведённый в коде интерфейс различаются. В частности, метод CharSequence::subSequence должен возвращать не целое число, как в представленном коде, а другую последовательность символов CharSequence:

CharSequence subSequence(int start, int end)
Returns a CharSequence that 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.

→ Ссылка