List<String> list = new ArrayList<>( ),如何把Activity对象放进list集合里去?

1,949 阅读1分钟

这是偶然看到一个面经里的面试题,已经收集到面试题整理(可在首页点击底部 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 对象基本就行了,思考问题前一定得清楚面试官问的点在哪,才可往下想解决方案。