Guice Generika - wie kann ich es weniger hässlich machen?

8

Ich habe eine Schnittstelle Producer<T> und eine konkrete FooProducer , die Producer<Foo> implementiert. Das zu binden, sieht hässlich aus wie Sünde:

%Vor%

Ich habe viele solcher Bindungen. Ich habe folgendes versucht:

%Vor%

Mit auf diese Weise getätigten Anrufen:

%Vor%

Aber es gibt einen Fehler in den Zeilen von Producer<T> is not specific enough... .

Gehe ich falsch herum?

    
Finbarr 23.09.2010, 10:29
quelle

3 Antworten

8

Anstelle von

%Vor%

versuchen Sie eine bequeme Methode wie

%Vor%

und dann in deinem Modul

%Vor%

Dieser ungeprüfte Cast sollte sicher sein. Schlüssel ist com.google.inject.Key and Types ist com.google.inject.util.Types.

viel Glück

    
Darren Gilroy 24.09.2010, 06:12
quelle
7

Sie können 8 Zeichen speichern, indem Sie new Key<Producer<Foo>>(){} statt new TypeLiteral<Producer<Foo>>(){} eingeben. Oder indem Sie die äquivalente Methode @Provides verwenden:

%Vor%     
Jesse Wilson 23.09.2010 15:28
quelle
3

Ich glaube, aufgrund der Funktionsweise von TypeLiteral s müssen Sie tatsächlich new TypeLiteral<Producer<Foo>>(){} schreiben oder die erforderlichen Informationen sind nicht verfügbar. Sie nutzen die Tatsache, dass eine Klasse, die ihre generischen Typen vollständig spezifiziert hat, Informationen über diese Typen erhalten kann. Wenn Sie new TypeLiteral<Producer<T>>(){} schreiben, geben Sie nicht an, was T ist, damit Informationen nicht verfügbar sind.

Es ist subjektiv, aber ich denke nicht, dass das Erstellen eines Typliterals zu hässlich aussieht, wenn man bedenkt, was es tut.

Nebenbei, ich weiß nicht, was Ihre Producer Schnittstelle tut, aber wenn nur für die Erzeugung von Instanzen von T verwendet wird (mit einer Methode, die keine Argumente annimmt), Sie könnten stattdessen Guices Provider -Schnittstelle verwenden. Dann müssen Sie nur tun:

%Vor%

Und Sie können eine Foo oder eine Provider<Foo> überall einfügen.

    
ColinD 23.09.2010 13:07
quelle

Tags und Links