the Guava libraryを探していて、空の匿名の内部クラスTypeToken
に出くわしました。Javaの空の匿名の内部クラス
TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};
正確に何を空の匿名の内部クラスの使用とそれが役立つことができる有用なシナリオはどのようなものですか?
the Guava libraryを探していて、空の匿名の内部クラスTypeToken
に出くわしました。Javaの空の匿名の内部クラス
TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};
正確に何を空の匿名の内部クラスの使用とそれが役立つことができる有用なシナリオはどのようなものですか?
だ場合、私は知りません - 型引数情報は保持されます。例えば
、ArrayList<String>
オブジェクトがその要素の型が原因消去し、
String
であることを、スーパークラスの情報が失われ
ないであることを知りませんがが、そう
new ArrayList<String>{}
は、そのスーパークラスが
ArrayList<String>
だけでなく、
ArrayList
であることを知っています。
TypeToken
は、その技法を使用して、構築されたジェネリック型を表します。
Guavaが使用する可能性のある用途が1つあります。ご存じのように、コンパイル後に型が失われますが、型がクラスレベルで宣言されていれば、コンパイル後に型が失われることはなく、リフレクションによって抽出できます。 1分で型を抽出するコードを記述します。
編集 これの目的はTypeToken
がスーパークラスのインスタンスのを見つけることができるようにすることですコードは、任意の使用であるが、ここでは
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);
}
}
}
実際のTypeTokenの使用と同じです。 –
私はしばらくの間、 'TypeToken'を使ってきましたが、繊細さと賢さを決して高く評価したことはありません。それはかなり素晴らしいです – Ray