Guavaライブラリを調べていたところ、で空の匿名内部クラスに出くわしましたTypeToken
。
TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};
空の匿名内部クラスの正確な使用とは何ですか?それが役立つ可能性がある有用なシナリオは何ですか?
Guavaライブラリを調べていたところ、で空の匿名内部クラスに出くわしましたTypeToken
。
TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};
空の匿名内部クラスの正確な使用とは何ですか?それが役立つ可能性がある有用なシナリオは何ですか?
これの目的は、インスタンスのスーパークラスTypeToken
を見つけられるようにすることです。これにより、型引数情報が保持されます。
たとえば、ArrayList<String>
オブジェクトはその要素タイプがString
であることを認識していませんが、消去のためにスーパークラス情報が失われることはないnew ArrayList<String>{}
ため、そのスーパークラスがArrayList<String>
だけでなく、であることを認識していArrayList
ます。TypeToken
その手法を使用して、構築されたジェネリック型を表します。
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);
}
}
}