【问题标题】:Empty anonymous inner class in javajava中的空匿名内部类
【发布时间】:2012-09-14 14:48:10
【问题描述】:

我在查看the Guava library,在TypeToken 中发现了一个空的匿名内部类。

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

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

【问题讨论】:

    标签: java guava inner-classes anonymous-class


    【解决方案1】:

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

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

    【讨论】:

    • 我使用TypeToken 已经有一段时间了,但从未完全欣赏过它的微妙和聪明。太棒了
    【解决方案2】:

    番石榴可能会使用一种用途。如您所知,类型在编译后会丢失,但如果在类级别指定类型,则编译后不会丢失,可以通过反射提取。一会儿我把提取类型的代码放上来。


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

    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的实际使用。