Проблема здесь в том, что StringReader
не имеет смысла расширять ByteArrayReader
. Вы перепутали наследование с композицией.
Когда StringReader
наследует от ByteArrayReader
, вы говорите, что он выполнит контракт, в котором говорится, что у него есть метод readNext
, который возвращает byte[]
.
Что вы действительно хотите сделать, это использовать состав вместо наследования:
class StringReader extends AbstractReader<String> {
private AbstractReader<byte[]> downstream;
public StringReader(AbstractReader<byte[]> downstream) {
this.downstream = downstream;
}
public String readNext() {
return new String(downstream.readNext());
}
}
Этот StringReader
соответствует контракту AbstractReader<String>
и реализуется в терминах нисходящего потока AbstractReader<byte[]>
. Обратите внимание, что он явно не требует ByteArrayReader
- любой старый AbstractReader<byte[]>
будет работать.