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

时间:2015-04-19 09:59:29

标签: java generics guice

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

  

为java.util.Set&LT; T&GT;不能用作钥匙;它没有完全确定。

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();
}

1 个答案:

答案 0 :(得分:4)

我使用此代码段创建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));
}

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