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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-25 21:18:03976ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。