2014-07-01 37 views
-1

假設我有這樣的:吉斯,泛型和TypeLiterals

public class Foo<T> { 
    @Inject public Foo(Class<T> tClass); 
} 

public class FooProvider<T> implements Provider<Foo<T>> { 
    @Inject private TypeLiteral<T> type; 
    @Override 
    public Foo<T> get() { 
     Class<T> rawType = (Class<T>) type.getRawType(); 
     return new Foo<>(rawType); 
    } 
} 

如果我有,在一個模塊中,

bind(Foo.class).toProvider(FooProvider.class); 

會自動綁定Foo<Integer>Foo<String>,等等,或將他們必須分開提供?另外假設我無法修改Foo,因此需要TypeLiteral<T>而不是Class<T>

相關問題:假設相反,我有Guava的TypeToken<T>(或其他類似的「類型令牌」類),並且我有一個提供程序將TypeLiteral<T>轉換爲TypeToken<T>。類似的原則會起作用嗎?

+0

爲什麼不自己試試呢? –

+0

IMO guice在處理仿製藥方面做得不好。有時候它可能看起來像是一個非常有效的過程,可以正確綁定泛型。 –

回答

0

給定的綁定

bind(Foo.class).toProvider(FooProvider.class); 

只會結合僅結合在類「富」(不指定一般類型)連接到提供者。您需要使用TypeLiteral來指定通用。你可以用下面的語句獲得所需的行爲:

bind(new TypeLiteral<Foo>(){}).toProvider(FooProvider.class); 
+0

仍頑固地拒絕爲我編譯。說'FooProvider.class'不能轉換成'Class <?擴展Provider <?延伸Foo >>'。任何調整,以便它可以工作...? –

+0

我認爲這個答案解決了問題的精神,但並沒有解決您的問題。看到我的其他答案來解決你的問題。 –

0

試試這個:

類:

public class Foo<T> { 
    @Inject public Foo(Class<T> tClass); 
} 

我猜你想要的JIT供應的泛型類型時自動注入課程,但這不會發生。這不是Guice的JIT的工作原理。您需要綁定您計劃使用的每種通用類型。請看下面的代碼片段(注意,我們也沒有約束力富,我們正在招投標將被注入到富類):

bind(new TypeLiteral<Class<MyType>>(){}).toInstance(MyType.class); 

來獲得實例,你需要定義的類型爲通用。

@Inject Foo<MyType> foo 

,並直接從注射器輪詢它,你必須是具體關於通用型

injector.getInstance(Key.get((new TypeLiteral<Foo<MyType>>(){})));