TypeLiteralでParameterizedTypeを取得する

Jersey2ソースコードリーディングの旅、第二弾。

前回は、型の旅をしてました。

bufferings.hatenablog.com

TypeLiteral

ということでTypeLiteralに戻ってきたんだけど、Jersey2ソースコードリーディングといいつつ、こいつはHK2のソースですね。Jersey2はDIコンテナとしてHK2を使ってるからね。

hk2/TypeLiteral.java at hk2-parent-2.4.0-b34 · hk2-project/hk2 · GitHub

今日のGoal

これを理解できれば良い!

private final Type REQUEST_TYPE = (new TypeLiteral<Ref<HttpServletRequest>>() {}).getType();

削ぎ落とす

TypeLiteralの中で、知りたいメインの部分だけを残してみると、こうなった。

abstract class MyTypeLiteral<T> {

  Type getType() {
    ParameterizedType paramterizeType = (ParameterizedType) this.getClass().getGenericSuperclass();
    return paramterizeType.getActualTypeArguments()[0];
  }

}

動作確認

まで含めるとこうなった。

gist.github.com

まとめ

型の情報を取得するためにこういう処理が必要ってことね。じゃ、次はWebComponent読もっと。

おまけ

TypeLiteralの中に、rawType常にnullというおもしろコードがあって癒やされた。rawTypeフィールドいらんやろ。

    public final Class<T> getRawType() {

        if (rawType == null) {

            // Get the actual type
            Type t = getType();
            return (Class<T>) getRawType(t);
        }

        return rawType;
    }