2012-06-01 7 views
3

Я пытаюсь инкапсулировать 3 интерфейса в один (ICountable) и сделать конкретный класс реализующим этот инкапсулирующий интерфейс. `ICountable код:Общий интерфейс mess

public interface ICountable extends IAddable, Cloneable, Serializable {} 

Addable определение интерфейса:

public interface IAddable<T> { 
    T add(T other); 
} 

теперь, когда я пытаюсь реализовать ICountable в конкретном классе (BaseCounter) Я получаю сообщение об ошибке, что не реализованы все методы (жалуясь на add способ). Я не понимаю, почему. BaseCounter код выглядит следующим образом:

public class BaseCounter implements ICountable { 
    @Override 
    public BaseCounter add(BaseCounter other) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

Изменить add метод подписи к

public ICountable add(ICountable other) 

исправления ситуации. Однако, изначально я хотел был сделать один интерфейс (ICountable), который расширяет 3 других (2 маркера и 1 интерфейс, который описывает способность класса реализации выполнять add на объекте того же типа). Что мне нужно изменить, чтобы сделать реализацию add метода в BaseCounter выглядеть следующим образом:

public BaseCounter add(BaseCounter other) 

Я был бы признателен за ваши предложения.

ответ

7

-Добавить в родовом ICountable

public interface ICountable<T> extends IAddable<T>, Cloneable, Serializable {} 

-Укажите родовой в реализации

public class BaseCounter implements ICountable<BaseCounter> { 
    @Override 
    public BaseCounter add(BaseCounter other) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 
+0

спасибо, приятель! поймать upvote ... – aviad

+0

вы хорошо. Вы можете добавить некоторые расширения для общих для ограничения, которые должны принимать только ICONTable: общедоступный интерфейс ICountable extends IAddable , Cloneable, Serializable {}. В этом случае в качестве типичного типа могут приниматься только подходы с использованием протокола ICANN. – alexey28

3

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

public interface IAddable<T> { 
    T add(T other); 
} 

public interface ICountable<T> extends IAddable<T>, ... { 
    .... 
} 

public class BaseCounter implements IAddable<T> { 
    @Override public BaseCounter add(BaseCounter other) { ... } 
} 

Это должно решить проблему ..

+0

спасибо! Довольно такая же идея, как в alexey28's. Я повышаю (но прием идет к нему с тех пор, как он был первым :)) – aviad

+0

Открытый класс BaseCounter реализует IAddable - foget для изменения общего T на BaseCounter – alexey28

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