2015-01-07 3 views
2

Guice를 사용하여 연습 문제를 해결하려고합니다. 나는 그 밖의 모든 것을 거의 다했으나,이 방법의 구현은 영혼을 혼란스럽게 만든다. 이 메소드의 목적은 로그 작성기의 등록자 역할을하는 것이고 올바른 로그 작성기 (@ 로거 이름)로 디스패치 메시지로 작동하는 또 다른 메소드가 있습니다. 나는 그 일을하는 방법을 알기 때문에 배차원에 대해 너무 걱정하지 않는다. 그러나 등록기 방법은 제네릭과 반사를 사용해야합니다. 나쁘게 여기에 갇혀 있고 Java 환경은 "java.lang.Class"로 반사를 사용할 때 거의 존재하지 않습니다. "클래스,에 myListener 인터페이스의 구현 또는 확장 anyType에 포함되어 있습니다"나는 위의 와일드 카드 지원 형식이라고 이해인터페이스 메서드 구현을 위해 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 
      * 
      */  
    } 


} 

:

이 코드는 아래와 같습니다. 그러나 익명을 위해 Class를 사용하는 것은 상당히 새로운 일입니다. 이 loggerObj가 실제로 수정되거나 멤버 함수를 호출하는 데 사용되는 예제를 볼 수 있습니까?

+0

"구현 본문"이란 무엇을 의미합니까? – fge

+2

실제로'MyListener.class'와 같은 클래스 객체를 전달하려고합니까? – markspace

+0

'listService'를 사용하면'doService'의 본문에서 많은 일을 할 수 있습니다. 그 방법이 무엇인지 명확히해야합니다. –

답변

1

귀하의 코드 내가 이렇게 반사에 사용하는, 어떤 사람이 통과 할 것이 클래스 인스턴스 추측 훨씬 이해가되지 않습니다, 당신은 거기에 어떤 방법를 호출 할 수 없습니다. 당신은 아마 어떤 반성을 할 수 있습니다.

더 나은 시도는 다음과 같습니다

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

하지만 당신은에 의해 교체 할 수 있기 때문에 그것은 오히려 무의미한 것 : 제네릭이 단지 같은 Collection<T> 유형에 사용되는

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

:

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에서, 자바는 Iterator<? extends MyListener>을 유도. 즉, IteratorMyListener에서 상속받은 객체 만 내보내고 Java는 유형 검사를 수행 할 수 있으므로이 객체가 실제로 MyListener 객체 일 때보 다 안전하다는 것을 알 수 있습니다.

+0

그래서 '클래스'가 더 혼란을 일으킨다는 말입니까? – ha9u63ar

+0

'Class'는 * reflection *을 위해서만 사용됩니다. 매우 고급 자바입니다. 예를 들어 모르는'Class' 메쏘드 목록을 얻을 수 있습니다. 그렇다고해도 와일드 카드를 사용하는 제네릭은 부분적으로 작동 할 수 있지만 매우 진보적이며 리플렉션을 사용하면 일반적으로 형식에 안전하지 않습니다. –

+0

이 문제를 해결하기 위해 사용할 수있는 웹 페이지를 추천 해 주시겠습니까? 나는 손을 잡으라고 요구하지 않고 있지만 실제로는 약간의 자료 만 사용할 수 있습니다. – ha9u63ar

관련 문제