2016-07-07 3 views
0

z.Wie bindet man einen generischen Typ mit der Methode @Provides in einem Guice AbstractModule?

public final class SomeModule<T> extends AbstractModule { 
    private final Class<T> clazz; 
    public SomeModule(Class<T> clazz) { 
    this.clazz = clazz; 
    } 

    @Provides 
    T getT(@ExternalAnnotation Any any) { 
    Any payload = asset.get().getPayload(); 
    return payload.<T>unpack(clazz); 
    } 
} 

Dies wird zu einem Fehler:

T cannot be used as a key; It is not fully specified. 

Weder mit TypeLiteral noch Key hier angemessen erscheint, da ich den Rückgabetyp will noch sein vom Typ T. Gedanken?

Antwort

2

Mit Typ löschen, Guice wird nicht genügend Informationen von einer Instanz Ihres Moduls haben, um festzustellen, welchen Typ Sie binden.

Akzeptieren Sie stattdessen ein Klassenliteral und verwenden Sie es. In diesem Beispiel werden die Generika beibehalten, aber wenn Sie sie für Ihren Anwendungsfall nicht benötigen, können Sie sie löschen.

// Warning: Untested. Please revise if needed. 
public final class SomeModule<T> extends AbstractModule { 
    private Class<T> t; 

    public SomeModule(Class<T> t) { 
    this.t = t; 
    } 

    @Override 
    public void configure() { 
    // Uses a class instance rather than reflection, so this is fine. 
    bind(t).toProvider(new Provider<T>() { 
     // ... do stuff 
    }); 
    } 
} 

Siehe auch:

+0

Danke für die schnelle Antwort und Link auf andere Beispiele! –

Verwandte Themen