モジュール実装内でジェネリック パラメータを明示的に指定せずに、ジェネリック インスタンスを提供したい。
非常に最適化された 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>>(){});
}
}