这是偶然看到一个面经里的面试题,已经收集到面试题整理(可在首页点击底部 Tab 看到)。
看到这个题目,必须要知道面试官考察的点是啥,有部分同学可能会认为是不是考察如果管理 app 里的 Activity 栈?那就想偏了,其实这里考察的是泛型擦除,什么是泛型擦除?为什么会产生泛型擦除?那么之后单开篇文章解释下,这里先把这个问题解决掉。
当我们正常的将 Activity 对象放进 List<String> list = new ArrayList<>( ) 这样的集合去,会报一个错,我们来看看:
![]()
显然,泛型的约束让我们无法将 Activity 对象放进泛型为 String 的集合中去,不急,我们来看看正常情况下 MainActivity 编译后的 class 长啥样:
# app/build/intermediates/classes
![]()
可以看到之前 java 代码里对 List 中的元素只能为 String 的泛型代码没了,这就是泛型擦除。那么也就是说泛型的约束是在编译时约束的,真正运行的 class 是没有泛型约束的,那么想解决题目的话,只要在运行时将 Activity 对象加入就好了,那么自然想到反射,我们来尝试下。
![]()
运行后打印出 size : 2,可见成功了。
那么再回到题目,面试时如果回答由于泛型擦除,在运行时添加 Activity 对象基本就行了,思考问题前一定得清楚面试官问的点在哪,才可往下想解决方案。