【发布时间】:2012-09-14 14:48:10
【问题描述】:
我在查看the Guava library,在TypeToken 中发现了一个空的匿名内部类。
TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};
空匿名内部类的具体用途是什么?它有哪些有用的场景?
【问题讨论】:
标签: java guava inner-classes anonymous-class
我在查看the Guava library,在TypeToken 中发现了一个空的匿名内部类。
TypeToken<List<String>> stringListTok = new TypeToken<List<String>>() {};
空匿名内部类的具体用途是什么?它有哪些有用的场景?
【问题讨论】:
标签: java guava inner-classes anonymous-class
这样做的目的是让TypeToken 找到实例的超类 - 这将保留类型参数信息。
例如,虽然ArrayList<String>对象不知道它的元素类型是String,但是由于擦除,超类信息没有丢失,所以new ArrayList<String>{}知道它的超类是ArrayList<String>,而不仅仅是ArrayList。 TypeToken 使用该技术来表示构造的泛型类型。
【讨论】:
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);
}
}
}
【讨论】: