Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Несоответствие возвращаемых типов

#java #ооп


Хочу добавить наследнику ByteArrayOutputStream поддержку интерфейса SeekableByteChannel.
Проблема в методе size(). Для ByteArrayOutputStream он объявлен как

public int size()


А для SeekableByteChannel

long size()


Если оставить базовую реализацию или продублировать свою

public int size() {
    return super.size();
}


То получаю две ошибки


  Error:(12, 8) java: ByteArrayOutputSeekableStream is not abstract and does not
override abstract method size() in java.nio.channels.SeekableByteChannel
  
  Error:(147, 17) java: size() in ByteArrayOutputSeekableStream cannot override size()
in java.io.ByteArrayOutputStream
    return type long is not compatible with int


Если метод переопределить

public long size() {
    return super.size();
}


то получаю ошибки


  Error:(157, 17) java: size() in ByteArrayOutputSeekableStream cannot override size()
in java.io.ByteArrayOutputStream
    return type long is not compatible with int
  
  Error:(37, 16) java: size() in BufferedOutputSeekableStream cannot implement size()
in java.nio.channels.SeekableByteChannel
    return type int is not compatible with long
  
  Error:(38, 26) java: incompatible types: possible lossy conversion from long to int


Проблема как-то решается? Или нужно добавлять в класс метод

public SeekableByteChannel getChannel();


и отдавать какой-то адаптер?
    


Ответы

Ответ 1



Ну собственно ты сам и ответил на свой вопрос. Переопределить метод нельзя, базовую реализацию тоже оставить не получится, не нарушив принципов ООП (что собственно компилятор тебе сделать и не дает). Так-же это можно было увидеть, прочитав документацию. Адаптер? А почему нет? В данном случае - достаточно хорошее решение.

Комментариев нет:

Отправить комментарий