数日前から、私は、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
。