それは別のTypeLiteralを作成するために2つのタイプを組み合わせることは可能ですか?

MrPiao:

このメソッドのシグネチャを考えると、それはそれを実装することは可能でしょうか?もしそうなら、どのように?

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ののその巧妙なジェネリックベースの保護のいくつかの敗北bindEDSLの提供を。仕事に上記取得するには、する必要があるかもしれない@SuppressWarnings、生の型を返すKeyか、を検討combineTypesリターンA Key<MyClass<T, R>>(からキャストが必要になりKey.get(Type)、戻り値のをKey<?>)。あなたが本当にTypeLiteralを使用する必要がある場合、あなたはを通してTypeLiteralを生成することができますKey.getTypeLiteralが、それはまたからのキャストを必要とするTypeLiteral<?>-そしていかなる意味の定義によって「リテラル型」ではないでしょう。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=208105&siteId=1