Jackson を型参照とともに使用する場合、ジェネリック メソッドで型消去を処理する方法は?

Susan Sarandon
リリース: 2024-10-25 21:18:03
オリジナル
984 人が閲覧しました

How to Handle Type Erasure in Generic Methods When Using Jackson with Type References?

ジェネリック メソッドでの Jackson と型参照

ジェネリック メソッドでのシリアル化と逆シリアル化に Jackson を利用すると、型消去の問題が発生する可能性があります。

テスター メソッドがジェネリック型参照を使用して JSON 文字列からジェネリック リクエスト オブジェクトを取得しようとする次のコードを考えてみましょう。

<code class="java">public MyRequest<T> tester() {
    TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>();
    MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
    return requestWrapper.getRequest();
}</code>
ログイン後にコピー

この問題は、getMyObject が実行されたときに発生します。 () メソッドがリクエスト オブジェクト内で呼び出されます:

<code class="java">@NotNull
@JsonIgnore
public T getMyObject() {
    return myobjects.get(0);
}</code>
ログイン後にコピー

Jackson はジェネリック型 T を Object として解釈し、getMyObject() メソッドが呼び出されたときの戻り値は LinkedHashMap になります。

このあいまいさを解決するには、T の実際のクラス型を明示的に指定する必要があります。これは、Class オブジェクトを引数として TypeReference に提供することで実現できます。

<code class="java">public MyRequest<T> tester() {
    TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>() {};
    MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef);
    Type type = typeRef.getType(); // Retrieve the actual type from the TypeReference
    return requestWrapper.getRequest(type);
}</code>
ログイン後にコピー

型変数を導入すると、指定された型情報に基づいて JSON オブジェクトを逆シリアル化するように Jackson に指示し、より正確で予測可能な動作を提供することが可能です。

以上がJackson を型参照とともに使用する場合、ジェネリック メソッドで型消去を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!