2010-04-21 4 views
12

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

Я получил следующие классы/интерфейсы:

interface Foo extends Comparable<Foo> 

interface Bar extends Comparable<Bar> 

abstract class BarDescription implements Bar 

class FooBar extends BarDescription implements Foo 

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

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

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

+0

Тот же вопрос, другой случай. Вы ищете нечто вроде стирания стилей. – falstro

+0

@row Кое-что называется подстановочными знаками. –

+3

@ codeman73: но вы просто не можете сделать это в Java ... Java не поддерживает истинный параметрический полиморфизм. Поэтому, когда вы фокусируетесь на «OO» вместо «Java idiosynchrasies», дженерики Java в основном бессмысленны: конечно, они подходят для «коллекций» и для процедурной программы (и, следовательно, хорошо соответствуют ментальности 99% Java-разработчики), но это просто не OO. Это моя самая большая проблема с дженериками в Java: у вас не может быть одновременно * Handable * и * Handable *, и это делает ненужные ** обобщающие ** с точки зрения OO. – SyntaxT3rr0r

ответ

14

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

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

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

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> 
+0

Это своего рода работа. Я все еще пытаюсь обвести вокруг себя голову. Зачем нам нужен Желаю, чтобы я сделал свой оригинальный пост с более конкретными примерами. – user26270

+0

Кроме того, не избыточно ли иметь интерфейс Foo >? Другая проблема заключается в том, что у меня есть много классов, которые расширяют BarDescription, но не Foo, и теперь все они должны определить тип для BarDescription и реализовать compareTo (AnotherBarDescription), например: class AnotherBarDescription extends BarDescription user26270

+0

Да, это избыточно. но у Java Generics есть проблемы. Одной большой проблемой является наследование (супер-тип - это вместо Object). Например, Foo foo = new Foo () не допускается. – mkorpela

8

Я бы написать пару Comparator с и сделать с ней.

1

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

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

Смежные вопросы