2012-05-01 3 views
5

Я хотел бы создать интерфейс, который имеет следующие методы:Использование Java дженериков в интерфейсах

public interface MyInterface { 
    public Class<X> getClass(); 
    public void handle(X message); 
} 

Где X должен быть того же типа в обоих методах. Причина, по которой мне нужно сделать это, - это получение сообщений, которые являются блобами, которые необходимо добавить в соответствующий класс (с использованием getClass), а затем я хотел бы заставить разработчиков реализовать метод дескриптора, который принимает соответствующий класс (вместо этого предполагая, что есть один и использовать отражение, чтобы называть его).

Похоже, что единственный способ сделать это, чтобы добавить тип параметров к интерфейсу, как так:

public interface MyInterface<T> { 
... 
} 

, но это меньше, чем идеал из-за зависимости каскада, что потребует определений этого типа в различном другие классы. Какие-либо предложения? Благодаря!

+2

+1 интересный как * общий * вопрос, хотя метод getClass на вашем интерфейсе запахи *** утечки реализации ***. – Perception

+0

'MyInterface.java:2: getClass() в MyInterface не может переопределить getClass() в java.lang.Object; переопределенный метод является окончательным public Class getClass(); ' ^ –

+0

Я не вижу, как ваш подход может быть полезен. Дженерики - это просто артефакт компилятора, поэтому нет смысла вызывать 'getClass' для поиска типа среды выполнения и затем нажимать этот тип на параметр статического типа. –

ответ

2

где X должен быть того же типа в обоих методах

Вы не можете применять 2 метода интерфейса зависят друг друга только по определению.
getClass и handle всегда будут 2 отдельных метода.
То, что вы, возможно, должны делать это иметь 1 методы, в handle и передать в качестве параметра типа класса (может быть как-то просто, как Enum или любым индикатор) и делегировать Factory создать соответствующий класс для использования внутри метода handle.
Таким образом, метод handle будет (в конечном итоге) получить соответствующий класс для работы.

2

Вы можете задать общие параметры типа методов, например, так:

public <X> void handle(X message); 

Но это не обеспечит согласованность методов, так что если у вас есть:

public <X> Class<X> getClazz(); 
public <X> void handle(X message); 

Вы не можете сказать, что значение <X> одинаково для обоих методов.

+1

Чтобы быть понятным, если вы предоставите метод 'public Class getClazz()', то метод _caller_ будет определять 'X'. –

+0

Ой, да, я должен был это отметить. Таким образом, вызывающий может также указать другой «Х» за вызов. – beerbajay