22

Guavaライブラリを調べていたところ、で空の匿名内部クラスに出くわしましたTypeToken

TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};

空の匿名内部クラスの正確な使用とは何ですか?それが役立つ可能性がある有用なシナリオは何ですか?

4

2 に答える 2

33

これの目的は、インスタンスのスーパークラスTypeTokenを見つけられるようにすることです。これにより、型引数情報が保持されます。

たとえば、ArrayList<String>オブジェクトはその要素タイプがStringであることを認識していませんが、消去のためにスーパークラス情報が失われることはないnew ArrayList<String>{}ため、そのスーパークラスがArrayList<String>だけでなく、であることを認識していArrayListます。TypeTokenその手法を使用して、構築されたジェネリック型を表します。

于 2012-09-22T10:55:44.167 に答える
18

Guavaが使用する可能性のある1つの使用法があります。ご存知のように、型はコンパイル後に失われますが、型がクラスレベルで指定されている場合、コンパイル後に失われることはなく、リフレクションによって抽出できます。型を抽出するためのコードをすぐに配置します。


編集コードが役に立ったかどうかはわかりませんが、ここにあります

public class Reflect {

    public static void main(String[] args) {
        Super<String> aStringSuper = new Super<String>() {};
        aStringSuper.method();

        Super<List<Integer>> aListSuper = new Super<List<Integer>>() {};
        aListSuper.method();
    }

}

class Super<T> {

    public void method() {
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
        for(Type type : parameterizedType.getActualTypeArguments()) {
            System.out.println(type);
        }
    }
}
于 2012-09-22T10:54:45.567 に答える