[英]Guice unbounded generic binding
我想提供通用實例,而無需在模塊實現中明確說明通用參數。
假設我有一個非常優化的Map實現,希望每個人都可以使用它。
class MyVeryOptimizedHashMap<K, V> implements Map<K, V> {}
我知道,遵循用法並不是最佳的設計模式,但是出於示例的目的,這是一個有效的要求:
class SomeInjectee {
@Inject
private Map<String, Integer> myMap;
}
要將以下實例綁定到我選擇的提供程序,請執行以下模塊聲明:
class GenericMapModule extends AbstractModule {
protected void configure() {
bind(new TypeLiteral<Map<String, Integer>>() {}).toProvider(new TypeLiteral<Provider<MyVeryOptimizedHashMap<String, Integer>>>() {});
}
}
問題是我必須明確聲明泛型類型參數,但我不可能對所有可能的類型都這樣做:
class SomeOtherInjectee{
@Inject
private Map<SomeUnknownKey, Long> myMap;
}
這解決了我的問題,但不是很優雅:
class GenericModule extends AbstractModule {
protected void configure() {
bind(new TypeLiteral<Map<?, ?>>() {}).toProvider(new Provider<Map<?,?>>() {
public Map<?, ?> get() {
return new MyVeryOptimizedHashMap();
}
});
}
}
class SomeOtherInjectee {
private Map<SomeUnknownKey, Long> myMap;
@Inject
void setMap(Map<?, ?> mapInstance) {
myMap = (Map<SomeUnknownKey, Long>) mapInstance;
}
}
我正在尋找的是這樣的:
class GenericModule extends AbstractModule {
protected void configure() {
bind(TypeLiteral.anyGenericVariant(Map.class)).toProvider(new TypeLiteral<Provider<MyVeryOptimizedHashMap>>(){});
}
}
如果適用於您的情況,請嘗試使用靜態實用程序方法。
class SomeOtherInjectee {
private Map<SomeUnknownKey, Long> myMap = newOptimizedMap();
如果這不適用,那么如您所見,Guice在泛型方面非常精確,即每個泛型代表一個唯一的綁定。 因此anyGenericVariant實際上必須列出所有可能的變體,並提前進行綁定。 瘋。
在這種情況下,您可以使用TypeListener注冊自定義注入。 看起來像
class SomeOtherInjectee {
@InjectOptimizedMap private Map<SomeUnknownKey, Long> myMap;
或您創建的任何自定義注入注釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.