1

我想知道如何表示不会失败的以下绑定的通用版本xxx cannot be used as a key it is not fully specified

install(new FactoryModuleBuilder().
   implement(new TypeLiteral<SomeClass<T,?>>(){}, 
      new TypeLiteral<SomeOtherClass<T, U>>(){}).
   build(SomeFactory.class);

似乎该implement方法不适用于参数化类型参数。

4

3 回答 3

2

这是不可能的,因为 Guice 使用类型文字参数的方式。TypeLiterals 需要具体类型,并且从异常中可以看出,它不能接受泛型参数。

引用@jesse-wilson

请注意,Guice 不允许绑定不完全限定的类型。例如,您可以绑定 aMap<String, Integer>但不能绑定 a Map<K, V>https://stackoverflow.com/a/1117878/654187

您可以按照此处所述“完全限定”这些绑定: https ://stackoverflow.com/a/1120990/654187

但我怀疑这是你想要的。

好消息是你仍然可以在没有辅助注入的情况下轻松编写这个工厂:

public class SomeFactory{
    @Inject
    private SomeDependency someDependency;

    public <T> SomeClass<T, ?> buildSomeClass(T t){
        return new SomeOtherClass<T, Object>(t, someDependency);
    }
}
于 2012-05-10T18:49:56.503 回答
1

Alen Vrečko发布

恕我直言,你可以用泛型做的最好的事情是

install(new Assist2<Payment, RealPayment>(PaymentFactory.class){});或者

install(new Assist3<SomeClass<Foo, Bar>, SomeOtherClass<Foo, Bar>, SomeFactory<Foo>(){});

应该很容易实现这种方法。只需查看 TypeLiteral 的来源即可。

如果您绝对需要类型参数,例如:

install(new CustomAssist<Baz>(){});在哪里

CustomAssist<T> extends Assist<SomeClass<Foo,T>,SomeOtherClass<Foo,Bar>{...

可能是可能的,但实施起来并不容易。但是很有趣。

于 2012-05-10T22:06:09.800 回答
0

从@johncarl 继续

如果您只是注入 someDependency ,那么您将在创建工厂时获得实例。要使其像 FactoryModuleBuilder 构造的工厂一样工作,您需要注入 Injector

public class SomeFactory{
    @Inject
    private Injector injector;

    public <T> SomeClass<T, ?> buildSomeClass(T t) {
        return new SomeOtherClass<T, Object>(t, injector.getInstance(SomeDependency));
    }
}
于 2013-10-10T10:26:12.543 回答