5

キャストを使用せずに、オブジェクトからJavaTypeReference<E>のオブジェクトに移動したい。コードでJacksonを使用する方法のために を使用する必要があり、アプリ内の他のジェネリック クラスの 1 つに型を推論するために使用する必要があるため、オブジェクトが必要です。Class<E>TypeReferenceClass

java.lang.reflect.TypeオブジェクトTypeReference.getType()が返されることはわかっています。基本的に、コードをキャストせずに からに取得する方法を見つけることができれば、問題は解決したことになります。TypeClass

Javadoc リファレンス:

4

2 に答える 2

11

キャストできません: これは非常に基本的な Java の質問です。TypeReference と Class は同じ基本クラスから派生していないため、言語定義に反しています。

しかし、あなたが達成しようとしていることを正しく推測できれば、次を使用して生の (型が消去された) クラスを変換できますJavaType

JavaType type = mapper.getTypeFactory().constructType(ref);
Class<?> cls = type.getRawClass();

、、または基本的な JDKから構築JavaTypeすることもできます。TypeReferenceClassType

于 2012-11-01T00:03:44.980 に答える
3

キャストせずに解決策はありません。ただし、これは一種の一般的なキャストを使用したソリューションです。多分これも役立つかもしれません:

public class Converter {
    public static <T> Class<T> convert(TypeReference<T> ref) {
        return (Class<T>)((ParameterizedType) ref.getType()).getRawType();
    }
}

ただし、これはフレームワークの方法です。署名は完全に型保存されており、Neal Gafter が TypeReference のアイデアを提供したブログ エントリで言及しているすべての「スーパー型トークン」情報を含むクラスに変換されます。これにより、ビジネス コードをクリーンに保ち、タイプを保存できます。

使用法は(ここではキャストを見ることができません...;-):

Class<List<String>> typ = Converter.convert(new TypeReference<List<String>>() {});
System.out.println(typ);

出力あり(もちろん、コードが文字列を示していても、インスタンスは型消去されています...):

interface java.util.List
于 2012-10-31T21:04:29.793 に答える