2012-03-19 2 views
1

나는 우리의 프로젝트에 대한 구글 GIN을 시도하고있다 그리고 나는 일반적인 인터페이스와 해당 인터페이스의 일반적인 구현이 경우 건너 온 : 주입GIN을 사용하는 일반 구현에 대한 일반 인터페이스의 기본 바인딩을 만드는 방법은 무엇입니까?

public interface IFace<T> { 
    void setEntry(T t); 
} 

public class Face<T> implements IFace<T> { 
    public void setEntry(T t) { 
    } 
} 

지금 내가 IFACE을 필요로하는 인터페이스의 사용자가을

public class IFaceUser { 
    private IFace<String> face; 

    @Inject 
    public IFaceUser(IFace<String> face) { 
     this.face = face; 
    } 
} 

내가 bind(IFace.class).to(Face.class);와 구현에 대한 인터페이스를 결합하려고하면 주입

Deferred binding result type 'IFace' should not be abstract 
,691 실패 : 생성자

그래서 GIN은 IFace<String>에 대한 바인딩을 찾지 못하며 IFace으로 돌아가서 바인딩을 사용하고 GWT.create(IFace.class)을 시도합니다.

나는 또한 bind(new TypeLiteral<IFace>(){}).to(new TypeLiteral<Face>(){});bind(new TypeLiteral<IFace<?>>(){}).to(new TypeLiteral<Face<?>>(){});을 시도했지만 성공하지 못했습니다.

나는 IFace<String>에서 Face<String>으로 묶을 수 있다고 알고 있지만, 반복되는 코드가 많은 거대한 모듈로 이어질 수 있습니다. @ImplementedBy(Face.class)을 사용하는 것도 가능하지만 옵션이 아닙니다.

마법이 필요합니까? bind(...).to(...) 조합이 필요합니까? GIN에서도 가능합니까?

답변

1

GIN에서는 불가능합니다.

가 몇 가지 해결 방법은 다음과 같습니다

  • 는 GIN는 IFACE 또는 IFACE를 주입하자 바이더 즉 일반적인 팩토리 메소드의 캐스트를 수행 주입으로 다음 IFACE을위한 공장을 쓰기 원하는 유형
  • 캐스팅 . 해당 팩토리를 주입하고 공장에서 IFace의 유형 보증 된 인스턴스를 가져옵니다.