2015-01-07 2 views
2

Я пытаюсь решить упражнение с использованием Guice. Я сделал почти все остальное, но реализация этого метода сбивает меня с толку. Цель этого метода состоит в том, чтобы выступать в качестве регистратора регистраторов, и существует другой метод, который будет действовать в качестве сообщений диспетчеризации для правильного регистратора (@ named loggers). Я не слишком беспокоюсь о диспетчере, поскольку я знаю, как это сделать. Но метод регистратора ДОЛЖЕН использовать дженерики и отражения. Я плохо застрял здесь, и мой опыт Java почти не существует, когда дело доходит до использования отражений с помощью «java.lang.Class».Использование обобщений и отражений в Java для реализации метода интерфейса

код приведен ниже:

class MyManagerImpl implements MyMgr { 

    /* MyListener below is an interface */ 
    public synchronized void regService(Class<? extends MyListener> loggerObj) { 
    ... 
    ... 
    ... 
    } 

    public synchronized void dispatch(String msg, String logger) { 
     /* dispatches the messages to the correct logger which 
      * I know how to do 
      * 
      */  
    } 


} 

Я понимаю, что приведенное выше выражение типа подстановочной поддержки говорит: «Класс содержит anytype, реализующие из, или расширяет, интерфейс MyListener». Но я совершенно новичок в использовании класса для анонимности. Можно ли увидеть пример, когда этот loggerObj фактически модифицируется/используется для вызова функции-члена.

+0

Что вы подразумеваете под «телом внедрения»? – fge

+2

Вы действительно собираетесь передать объект класса, например 'MyListener.class'? – markspace

+0

Вы можете использовать 'listenerClass', чтобы делать много вещей в теле' doService'. Вам нужно уточнить, для чего предназначен этот метод. –

ответ

1

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

Лучше попытка будет:

public synchronized void doService(<? extends MyListener> listenerObj) { 
    //... 
    //... 
    //... 
} 

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

public synchronized void doService(MyListener listenerObj) { 
    //... 
    //... 
    //... 
} 

дженериков просто используются для Collection<T> типов, таких как:

public synchronized void doService(Collection<? extends MyListener> listenerObj) { 
    //... 
    //... 
    //... 
} 

То, что вы можете позвонить ему ArrayList<SubMyListener> или ArrayList<SubSubMyListener> и т.д. Это потому, что следующее наследование отношение не имеет:

ArrayList<SubSubMyListener> extends ArrayList<SubMyListener> 

Почему это полезно?:

Допустим, вы ожидаете какой-то коллекции с MyListener объектов, теперь вы можете указать метод с подписью:

Foo method (Collection<? extends MyListener> bars) { 

} 

Но если кто-то хочет, чтобы вызвать метод с Collection<SubMyListener>, он не следуйте наследованию, поэтому компилятор не допустит этого. С помощью подстановочных знаков вы можете это сделать.

Вы можете использовать это ограничение, чтобы вызывать метод, определенный на MyListener. Например:

void callAll (Collection<? extends MyListener> bars) { 
    for(MyListener bar : bars) { 
     bar.call(); 
    } 
} 

Сейчас в for -loop, Java происходит в Iterator<? extends MyListener>. Другими словами, Java знает, что Iterator будет генерировать только объекты, которые наследуют от MyListener, это может быть использовано для того, чтобы Java могла выполнять проверку типов, и это, таким образом, более безопасно, чем надеяться, что объекты действительно являются объектами MyListener.

+0

Значит, вы говорите, что 'Class' создает больше путаницы? – ha9u63ar

+0

«Класс» более или менее используется только для * reflection *, это очень продвинутая Java, где вы можете, например, получить список методов класса, которые вы не знаете. Даже в этом случае дженерики с подстановочными знаками могут играть определенную роль, но они очень продвинуты и, используя отражение, в целом не являются безопасными для типов. –

+0

Не могли бы вы порекомендовать что-нибудь в Интернете, которое я могу использовать для решения этой проблемы? Я не прошу держать мои руки, но я действительно мог использовать некоторые материалы. – ha9u63ar

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