Я создаю класс, который переопределяет подпись метода, стирание которой идентично между двумя реализованными интерфейсами, но с незначительной разницей в отношении общего типа (один - тип, определяемый методом, другой - тип предполагаемого класса). Я ищу аккуратное решение. Я МОГУ ТОЛЬКО отредактировать унаследованный класс, а не оригинальные устаревшие интерфейсы.Название Clash, override fail, класс, реализующий два интерфейса с тем же стиранием
Чтобы показать случай, я сделал абстрактный образец, чтобы понять проблему:
Я получил Разработчик наследства родительского класса:
public class Developer<C>{
Rate<C> getRate(Taxes<C> tax){ /*...*/ }
}
Я также получил арендуемый унаследованный интерфейс, с почти идентичная подпись
public interface Rentable {
<C> Rate<C> getRate(Taxes<C> taxes);
}
Как разработчик не арендуемый, в моей модели, я создаю специальный разработчика, который является одновременно девелоперым и Арендуемый материал.
public class OutsourcableDeveloper<C>
extends Developer<C>
implements Rentable{
@Override
public Rate<C> getRate(Taxes<C> taxes){ /*...*/}
}
, а затем я получил печально известное
Имени столкновения: Метод getRate (Developer.Taxes) типа OutsourcableDeveloper имеет то же стирание как getRate (Developer.Taxes) типа, но Арендуемый не отменяет его
Как я могу избавиться от него, так OutsourcableDeveloper.getRate() скрывает как разработчик и арендуемое. getRate()?
Кажется, что нелогично отказываться от общего переопределения, но затем запретить распространение обеих подписей, поскольку стирания равны.
Действительно ли имеет значение тот факт, что один из супертипов вводит тип метода, а другой из класса специально, когда я не собираюсь называть супер в моей реализации? Может быть, есть трюк, чтобы преодолеть проблему, учитывая это упрощение?
EDIT: Я открыл более абстрактную, менее ориентированные на конкретные решения в мою актуальную проблему, вопрос для обсуждения проблемы проектирования наследования, который я считаю это коррелированной сущность фактического вопроса у меня возникли: Why can't I extend an interface "generic method" and narrow its type to my inherited interface "class generic"?
edit2 : Предыдущий вопрос привел меня к ответу, размещенному здесь
Хороший ответ спасибо (я подожду, чтобы увидеть, есть ли что-нибудь более сложное или простое) !! BTW, если я не могу либо выбрать ограниченную по методу версию метода в моем дочернем элементе, столкновение имен: метод getRate (Developer.Taxes) типа OutsourcableDeveloper имеет то же стирание, что и getRate (Developer.Taxes ) типа Разработчик , но не переопределяет его –
Whimusical
И, на мой взгляд, рационального для такого поведения нет, компилятор должен обеспечить более строгое из двух. Я реализую один и тот же метод, в одном интерфейсе тип *, а в другом должен быть тем же классом, поэтому в случае, если вы реализуете оба варианта, ограниченный класс может быть прозрачным, без нарушения какой-либо некогерентности, я считаю. – Whimusical
Это невозможно. Вызывающий интерфейс ожидает, что любые параметры будут разрешены. Если вы ограничите их программированием, вы портите намерение ООП. –