3

Guice Provider를 사용하여 wiki entries like thisSOF questions like this과 같이 일반 클래스에 바인딩하는 방법에 대한 온라인 리소스가 많이 있습니다. 그러나 제네릭 자체를 사용하는 방법에 대한 리소스를 찾는 데 문제가 있습니다. 당신이 볼 수 있듯이Guice 일반 공급자 (공급자 자체는 바인딩되는 클래스가 아닌 일반 공급자)

public interface Foo { 
    ... 
} 

public class Bar implements Foo { 
    ... 
} 

는, 바 생성자에서해야하는 사출 매개 변수가 있습니다 :

는 예를 들어, 다음 내가 가지고 말할 수 있습니다. 내 상황에서는이 매개 변수를 필드 또는 메소드 삽입으로 이동할 수 없습니다.

이제 Foo 용 제공자를 작성하려고하지만 Bar 인스턴스를 반환합니다. 이런 식으로 뭔가 : 공급자가 .toProvider(FooProvider.class)를 사용하여 구성해야합니다 있도록이 클래스는, Guice 분사 자체에 의존하는 싱글 얼마나

@Singleton 
public class FooProvider<T extends Foo> extends Provider<Foo> { 
    @Inject 
    public FooProvider(Object someParameterWeMustInjectIntoConstructor) { 
     ... 
    } 
    ... 
    @Override 
    public Foo get() { 
     return new Bar(...); 
    } 
    ... 
} 

알 수 있습니다. 우리는 또한 메소드 나 필드 주입이 아닌 생성자 삽입 만 사용할 수 있습니다. 아마도이 제공자의 유형 계층 구조 때문일 수 있습니다.

나는 .toProvider(FooProvider<Bar>.class)을 사용하고 있었는지 알아 내려했지만, 우리는 이것이 유효한 자바 구문이 아니라는 것을 알고 있습니다. 누구든지 구현의 구체적인 클래스를 만들 수 있도록 제네릭 공급자를 사용할 수 있도록 내가 모듈의 Guice 바인더 .toProvider(Class<? extends Provider>) 메서드를 사용할 수있는 방법을 알고 있습니까? 제 질문이 좀 혼란 스럽다면 알려주세요.

+0

당신은 왜 사용해야합니까 그것은 분명하지 않다 반사 – Johan

+0

을 사용해야합니다'FooProvider은 'FooBarProvider가 제공 {확장, 말, 제공자 '대신 확장 ... 새 줄을 반환 (...); }'. 당신이 정말로 그런 것을 필요로한다면, 왜 당신이 그것을 필요로하는지 상세히 설명해 주시겠습니까? –

+0

내가 받아들이는 대답은 내가 찾고있는 것이다. – ecbrodie

답변

7
toProvider(new TypeLiteral<FooProvider<Bar>>() { }); 
+0

'toProvider'는'TypeLiteral'이 아니라'Provider'를 기대한다. –

+0

나는 고쳐졌다! –

+0

시간에 링크 구문을 파악할 수 없으므로 [this] (http://google-guice.googlecode.com/git/javadoc/com/google/inject/binder/LinkedBindingBuilder.html#toProvider%28com. google.inject.TypeLiteral % 3C? % 20extends % 20javax.inject.Provider % 3C? % 20extends % 20T % 3E % 3E % 29). –