このメソッドのシグネチャを考えると、それはそれを実装することは可能でしょうか?もしそうなら、どのように?
TypeLiteral<MyClass<T, R>> combineTypes(Class<T> typeOne, Class<R> typeTwo) {
// Awesome implementation here
}
バックグラウンド
私はインターフェイス、持っているApiHandler<TReq, TRes>
私は、Guiceのと、工場に指定された型を作成しようとしていますTReq
。私はまた、タイプに渡すことができTRes
、必要に応じて。残念ながら、TReq
そしてTRes
私のコントロールを超えた理由のために意味のある親クラスやインタフェースを持たない(彼らは、Apacheスリフトから生成されています)。
あなたは、実行時の引数に基づいて、それを計算している場合、それはもはやませんリテラル:それはちょうどタイプです。
あなたはTypeTokenとそのユーティリティのグアバの同等のフレームワークを使用することができますが、Guiceのに組み込まれているタイプのユーティリティクラスがあります:com.google.inject.util.Types。使用newParameterizedType(Type rawType, Type... typeArguments)
は、ParameterizedTypeとクラスタイプを実装して、両方のことを指摘し、あなたが望むタイプを作成します。
static ParameterizedType combineTypes(Class<?> typeOne, Class<?> typeTwo) {
return Types.newParameterizedType(MyClass.class, typeOne, typeTwo);
}
残念なことに、AbstractModule.bind
およびLinkedBindingBuilder.to
タイプのためのオーバーロードを提供していません。ちょうどクラス、TypeLiteral、およびキー。幸いにも、あなたが使用して、反射的タイプを使用してキーを生成することができますKey.get(Type)
:
bind(Key.get(combineTypes(Foo.class, Bar.class))).to(MyClassFooBar.class);
注、この中で、それは、ParameterizedTypeは、パラメータ化された型ではない、それ自体です。これはGuiceののその巧妙なジェネリックベースの保護のいくつかの敗北bind
EDSLの提供を。仕事に上記取得するには、する必要があるかもしれない@SuppressWarnings
、生の型を返すKey
か、を検討combineTypes
リターンA Key<MyClass<T, R>>
(からキャストが必要になりKey.get(Type)
、戻り値のをKey<?>
)。あなたが本当にTypeLiteralを使用する必要がある場合、あなたはを通してTypeLiteralを生成することができますKey.getTypeLiteralが、それはまたからのキャストを必要とするTypeLiteral<?>
-そしていかなる意味の定義によって「リテラル型」ではないでしょう。