22

我正在查看Guava 库,在TypeToken.

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

空匿名内部类的确切用途是什么?它有哪些有用的场景?

4

2 回答 2

33

这样做的目的是允许TypeToken找到实例的超类——这将保留类型参数信息。

例如,虽然一个ArrayList<String>对象不知道它的元素类型是String,但由于擦除,超类信息没有丢失,所以new ArrayList<String>{}知道它的超类是ArrayList<String>,而不仅仅是ArrayListTypeToken使用该技术来表示构造的泛型类型。

于 2012-09-22T10:55:44.167 回答
18

有一种用途,番石榴可能会使用。如您所知,类型在编译后会丢失,但如果在类级别指定类型,则编译后不会丢失,可以通过反射提取。我将在一分钟内将代码用于提取类型。


编辑我不知道代码是否有用,但在这里

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 回答