Подтвердить что ты не робот

Как я могу реализовать Comparable более одного раза?

Я обновляю код на Java 5 и явно не понимаю что-то с Generics. У меня есть другие классы, которые реализуют Comparable один раз, который я смог реализовать. Но теперь у меня есть класс, который из-за наследования заканчивает попытку реализовать Comparable для 2 типов. Вот моя ситуация:

У меня есть следующие классы/интерфейсы:

interface Foo extends Comparable<Foo>

interface Bar extends Comparable<Bar>

abstract class BarDescription implements Bar

class FooBar extends BarDescription implements Foo

С этим я получаю интерфейс ошибки. Comparable не может быть реализован несколько раз с разными аргументами... '

Почему я не могу использовать compareTo (Foo foo), реализованный в FooBar, а также compareTo (Bar), реализованный в BarDescription? Разве это не просто перегрузка метода?

Изменить: у меня есть много классов, которые расширяют BarDescription. Если я удалю параметр типа для столбца Comparable on Bar, оставив его в исходном состоянии, я получаю кучу предупреждений компилятора при сортировке всех классов, которые расширяют BarDescription. Будет ли это решено с помощью подстановочных знаков ниже? Этот ответ выглядит довольно сложным и трудным для понимания.

4b9b3361

Ответ 1

Генерики не существуют после компиляции байт-кода.

Ограничения на это: вы не можете реализовать/расширить два или более интерфейсов/классов, которые были бы одинаковыми без общего параметра и отличались бы от общего параметра.

Что вы можете сделать, если действительно хотите, чтобы безопасность типа была:

interface Foo<T extends Foo<?>> extends Comparable<T>
interface Bar<T extends Bar<?>> extends Comparable<T>
abstract class BarDescription<T extends Bar<?>> implements Bar<T>
class FooBar extends BarDescription<FooBar> implements Foo<FooBar>

Ответ 2

Я бы написал пару Comparator и покончил с этим.

Ответ 3

Наличие нескольких реализаций общих интерфейсов может вызвать проблемы при использовании подстановочных знаков.

Это не зависит от стирания.