java中的空匿名内部类

java中的空匿名内部类,java,guava,inner-classes,anonymous-class,Java,Guava,Inner Classes,Anonymous Class,我在调查时,发现了一个空的匿名内部类 TypeToken stringListTok=新的TypeToken(){}; 空匿名内部类的确切用途是什么?在哪些有用的场景中它会有所帮助?有一个用途,番石榴可能会用到。正如您所知,类型在编译后丢失,但是如果类型是在类级别指定的,那么它在编译后不会丢失,并且可以通过反射来提取。我将在一分钟内输入代码以提取类型 编辑 我不知道这个代码是否有用,但在这里 public class Reflect { public static void mai

我在调查时,发现了一个空的匿名内部类

TypeToken stringListTok=新的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);
        }
    }
}
公共类反映{
公共静态void main(字符串[]args){
Super aStringSuper=new Super(){};
aStringSuper.method();
Super aListSuper=新的Super(){};
方法();
}
}
超级班{
公开作废法(){
类型genericSuperclass=this.getClass().getGenericSuperclass();
ParameteredType ParameteredType=(ParameteredType)genericSuperclass;
对于(类型:ParameteredType.getActualTypeArguments()){
系统输出打印项次(类型);
}
}
}

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


例如,尽管
ArrayList
对象不知道其元素类型是
String
,但由于擦除,超类信息不会丢失,因此
new ArrayList{}
知道其超类是
ArrayList
,而不仅仅是
ArrayList
TypeToken
使用这种技术来表示构造的泛型类型。

这就是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);
        }
    }
}