Guice Multibindings:从 Injector 手动获取 Set<T>

Sim*_*onT 3 java generics guice

使用 guice Multibindings 扩展可以注入特定类型的 Set 而不是该类型的单个实例。我如何使用 Injector.getInstance(...) 从 Injector 手动获取这个 Set?到目前为止,我的尝试导致了一个带有消息的 ConfigurationException:

java.util.Set<T> 不能用作键;它没有完全指定。

public final <T> Iterator<T> loadServices(Class<T> type) {
    final TypeLiteral<Set<T>> lit = new TypeLiteral<Set<T>>() {};
    final Key<Set<T>> key = Key.get(lit);
    final Set<T> bindings = this.injector.getInstance(key);
    return bindings.iterator();
}
Run Code Online (Sandbox Code Playgroud)

Tav*_*nes 6

我使用这个片段来创建一个TypeLiteral<Set<T>>

import com.google.inject.util.Types;

@SuppressWarnings("unchecked")
public static <T> TypeLiteral<Set<T>> setOf(Class<T> type) {
    return (TypeLiteral<Set<T>>)TypeLiteral.get(Types.setOf(type));
}
Run Code Online (Sandbox Code Playgroud)

我在这里还有一些其他类似的便利:https : //github.com/tavianator/sangria/blob/master/sangria-core/src/main/java/com/tavianator/sangria/core/TypeLiterals.java