TypeReference <地図<文字列、文字列>>(){}

Hriaekis:

数日前から、私は、Webサービスのプロジェクトの作業を開始しました。このプロジェクトは、使用しているジャクソンのマーシャリングとアンマーシャリングにJSONオブジェクトをだから私の質問は以下のとおりです。

なぜいつも私が配置する必要があり{}、私はのインスタンスを作成していたときにTypeReference私は、コンストラクタがある知っているprotectedが、なぜですかprotected私は、以来、それはコンストラクタは、コンストラクタの実装を作成見えるようにするハックのようなものだと思ってTypeReferenceいるabstractし、あなたがそれを行うことができます。しかし、これのポイントは何ですか?

String jsonString = "{\" firstName\":\"John\",\"lastName\":\"Chen\"}";
ObjectMapper objectMapper = new ObjectMapper();

// properties will store name and value pairs read from jsonString
Map<String, String> properties = objectMapper.readvalue(
    jsonString, new TypeReference<Map<String, String>>()
        { //
        });
リノ:

TL; DR

以下のためにそれをサブクラス化を介して可能であるTypeReference抽出するために、実際のジェネリック型パラメータを。例えば:

TypeReference<String> ref = new TypeReference<String>(){};
System.out.println(ref.getType());

版画:

class java.lang.String

あなたは、通常のクラスを使用できない場合に役立ちます。例えば、これは動作しません。

// doesn't work
Type type = ArrayList<String>.class; 

あなたはまだ使用してそのクラスを取得することができますTypeReference

// will yield Class<ArrayList<String>>>
Type type = new TypeReference<ArrayList<String>>(){}.getType();

詳細

見たときのソースコードTypeReference(ジャクソン2.8.5を使用して)あなたは、コンストラクタ本体は次の行が含まれていることを確認できます。

Type superClass = getClass().getGenericSuperclass();
if (superClass instanceof Class<?>) { // sanity check, should never happen
    throw new IllegalArgumentException("Internal error: TypeReference constructed without actual type information");
}
_type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

興味深い行は、最初と最後です。のは、最初の行を詳しく見てみましょう。

Type superClass = getClass().getGenericSuperclass();

匿名クラスを使用して、サブクラスを作成しているとき、例えば:

TypeReference<SomeStype> ref = new TypeReference<SomeType>(){};

その後、getClass現在の戻りClassオブジェクト(匿名クラス)、およびgetGenericSuperclass()戻りますClassからオブジェクトをclass現在の実装では、我々の場合には、から延び、superClass等しくなりますClass<TypeReference<?>>

今コンストラクタ本体から最後の行を見たときに:

_type = ((ParameterizedType) superClass).getActualTypeArguments()[0];

我々はそれを知っているようsuperClassであるClassため、オブジェクトTypeReference<?>我々はそれが一般的なパラメータを持っていることを知っています。そのためにキャストParameterizedType指定されたこれは、Typeメソッド有しgetActualyTypeArguments()、そのクラスによって指定されたすべての汎用パラメータの配列を返します。我々の場合には、それだけで1ですので、[0]最初の要素が得られます。例では、実際に指定された型パラメータを取得しますSomeType

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=224083&siteId=1