关于匿名内部类的类型获取问题getGenericSuperclass

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiey94/article/details/79865281

先放一下我的代码:

public abstract class TestInterface<T> {
    private T t;

    public abstract void onBack(T data);

    public TestInterface() {
        onBack(t);
    }
}
public class Test {
    public static void main(String[] args) {
        new TestInterface<String>() {
            @Override
            public void onBack(String str) {
                // TODO Auto-generated method stub
                System.out.println("" + this);
                System.out.println("" + getClass());
                System.out.println("" + getClass().getSuperclass());
                System.out.println("" + getClass().getGenericSuperclass());
            }
        };
    }
}

打印的结果是:

Test$1@4f1d0d
class Test$1
class TestInterface
TestInterface<java.lang.String>

当打印出来后,我很疑惑,为什么会是这种结果
当打印出this和getClass()后我第一眼看差了,我以为是Test,把“$1”看漏了,我就顺着错误的思路往下看,假设当前类是Test,那么他的超类怎么会是这个TestInterface抽象类呢?难道当前类默认已实现的匿名内部类为他的父类???

懵逼了!!!没见过这个说法啊,孤陋寡闻?那就百度一下,也没找到

回头再仔仔细细的看一遍,为什么会有一个”$1”呢?不是很懂,就搜索了一下,原来这是编译后的匿名内部类。这就能理解了。

那为什么匿名内部类的父类为这个抽象类的本身呢?
抽象类有两种实现方法:1、继承这个抽象类;2、匿名实现,重写父类方法;
这样就真相大白了。


其实接触到这个案例很偶然也很必然,之前在看别人封装好的Volley还有OKHttp的时候,到最后的调用过程中进行Gson转换时都要传入一个当前类的XX.class进去,碰到数组类型的要

new TypeToken<List<XX>>() {}.getType()

这样就让人很不爽,然后看到师傅封装的Volley并没有这么做,就去看了一下,他把回调的两个接口都截取了,封装成了一个带泛型的抽象类用来回调,然后在回调中传入接受的bean就可以了,那关键就在回调中,他在回调中是动态获取泛型参数的(也就是那个bean),就这样通过getGenericSuperclass来获取那个泛型参数,就OK了。

猜你喜欢

转载自blog.csdn.net/xiey94/article/details/79865281
今日推荐