21

基本的に、この質問の正反対です。Class<T> オブジェクトを TypeReference<T> オブジェクトに変換したいと考えています。

私が試してみました:

foo(Class<T> valueType)
{
   TypeReference ref = new TypeReference<T>(){}; 
}

ただし、それはクラスのスーパー クラスの型参照を返すだけです。私も試しました:

foo(Class<T> valueType)
{
   TypeReference ref = new TypeReference<valueType>(){}; 
}

foo(Class<T> valueType)
{
   TypeReference ref = new TypeReference<valueType.getRawClass()>(){}; 
}

しかし、次の 2 つはコンパイルされません。どうすればいいですか?

4

3 に答える 3

24

getType()タイプを返すようにオーバーライドできます。

new TypeReference<T>(){
    @Override
    public Type getType() {
        return valueType;
    }
}; 
于 2012-12-06T19:14:32.327 に答える
6

他の人が指摘したように、間違った問題を解決している可能性があります。統合したいのは、実際には ですJavaType。これは、両方の入力が変換されるものであり、Jackson が内部的にすべてに使用するものだからです。そして、に到達するための便利なメソッドを持つことができますJavaType

于 2012-12-07T01:58:24.643 に答える
1

Class オブジェクトを TypeReference オブジェクトに変換したいと考えています。

これを行うことは可能かもしれませんが、それで解決できる現実的な問題は思いつきません。TypeReference javadocからのこの情報を考慮してください

このクラスは、完全なジェネリック型情報を渡し、型消去の問題を回避するために使用されます (基本的に、ランタイム Class オブジェクトから使用可能な型参照のほとんどを削除します)。

これについての私の解釈は、Class の代わりに TypeReference を使用するのは、Class オブジェクトが提供できるより多くの型情報が必要な場合だけです。では、この変換を行う方法を理解できたとしても、何を得たのでしょうか? 消去された型情報を Class から TypeReference に戻す方法はありません。

Class ではなく TypeReference が必要な場合はいつでも、具体的な型参照インスタンスを作成し、実行時にそのオブジェクトを渡します。このようなもの(コンパイルできないかもしれませんが、アイデアは得られます)

foo(TypeReference<T> refArg)
{
   TypeReference<T> ref = refArg; 
}

// later on
object.foo(new TypeReference<List<Set<MyObject>>(){});
于 2012-12-06T19:51:26.187 に答える