Переопределение метода, который требует параметризации необработанного типа

Хорошо, вот мой вопрос: у меня есть абстрактный суперкласс, который содержит метод public double[][] extractFeatures(BufferedImage image) throws Exception.

Я хочу переопределить его (то есть, чтобы моя реализация подкласса вызывалась, когда я определяю объект подкласса). Проблема в том, что реализация, которую я использую, требует параметризации необработанного типа, например <II extends ImageSingleBand>, для правильной работы (в противном случае будут ошибки). Итак, теперь подпись становится:

public <II extends ImageSingleBand> double[][] extractFeatures(BufferedImage image)

Проблема в том, что компиляторы Java дают мне конфликт имени, отмечая, что он имеет

то же стирание, но не отменяет его

Факт, который может помочь, заключается в том, что в методе подкласса extractFeatures(), когда я не использую параметризацию исходного типа, возникает ошибка, когда код объявляет переменную:

Class<II> integralType = ...

Изменение этого на Class<II extends ImageSingleBand> integralType = ... также не решило проблему.

Я знаю, что могу обойти эту проблему разными способами:

  • (a) Переименование extractFeatures() подкласса (я могу использовать его в моем случае, я бы предпочел более последовательное решение)

  • (b) Перемещение всех частей, требующих параметризации необработанного типа, в другую функцию, которую можно вызвать внутри подкласса extractFeatures() (это решение выбрал предыдущий кодировщик), поэтому я не прошу решения, которое работает, а для прояснения ситуации.

Мой вопрос заключается в том, есть ли способ решить эту проблему без использования обходного решения, подобного упомянутому ранее, или эта проблема стирания связывает мне руки.


person Eypros    schedule 05.06.2014    source источник
comment
Зачем давать методу подкласса то же имя, что и методу базового класса, когда метод подкласса реализует новое поведение, которое не соответствует или повторно использует поведение базового класса? Такой дизайн может привести к серьезному непониманию вашего API.   -  person Smutje    schedule 05.06.2014
comment
Чтобы метод переопределял другой, он должен иметь точно такие же аргументы. Допускается быть ковариантным в возвращаемом типе. т.е. он должен быть применим во всех ситуациях, где был бы переопределенный метод. Я все равно не вижу, чтобы вы использовали аргумент типа II в сигнатуре метода - зачем вам это нужно?   -  person Boris the Spider    schedule 05.06.2014
comment
@Smutje, возможно, это так (в конце концов, плохой дизайн), но я не разрабатывал проект с самого начала, поэтому добавление новых функций привело меня сюда. Я ведь учусь.   -  person Eypros    schedule 05.06.2014
comment
@Boris, ну я не использую это подпись, но компилятору необходимо продолжить часть Class<II> integralType = ....   -  person Eypros    schedule 05.06.2014
comment
И почему ваш тип не может пойти туда? Кажется, нет причин для этого в сигнатуре метода.   -  person Boris the Spider    schedule 05.06.2014


Ответы (1)


Я бы посоветовал держаться подальше от подклассов и использовать шаблон проектирования, подходящий для этой задачи, такой как адаптер.

Весь смысл адаптера заключается в реализации определенного интерфейса (в вашем случае параметризованного метода), который использует другой интерфейсный модуль/класс/метод для выполнения фактической работы (в вашем случае непараметризованный метод).

Фактическая реализация адаптера заключается в выполнении любых необходимых адаптаций между интерфейсами к входным параметрам, вызове фактического средства реализации, адаптации результатов в соответствии с типом вывода и возврате результата.

Подробнее об этом можно узнать по адресу: Адаптер.

person ethanfar    schedule 05.06.2014
comment
Спасибо, я проверю - person Eypros; 05.06.2014