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では、完全修飾されていない型のバインドは許可されていないことに注意してください。たとえば、をバインドすることはできますが、をバインドするMap<String, Integer>ことはできません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 に答える