ジェネリック メソッドでの 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 サイトの他の関連記事を参照してください。