前言
这是我在抖音二面的时候自我感觉没有答好的一题,因为我的中心只是围绕在了
<代码> T 代码>被
<代码>对象> 代码替换的问题上了,并没有去讲解他会带来的问题。
思维导图
什么是泛型擦除?
其实我们很常见这个问题,你甚至经常用,只是没有去注意罢了,但是很不碰巧这样的问题就容易被面试官抓住。下面先来看一段代码吧。
<>之前,,List List =, new ArrayList ();,, List listString =, new ArrayList
();,, List listInteger =, new ArrayList ();
这几段代码简单,粗暴,又带有很浓厚的熟悉感是吧。那我接下来要把一个
<代码>数字1> 代码插入到这三段不一样的代码中了。
作为读者的你可能现在已经黑人问号了? ? ? ?你肯定有很多疑问,这明显不一样啊,怎么可能。
<>之前,,public class Main {,,,,, public static void main (String [], args), {,,,,,,,,, List List =, new ArrayList ();,,,,,,,,,, List listString =, new ArrayList (),,,,,,,,,,, List listInteger =, new ArrayList (),,,,,,,,,,, try {,,,,,,,,,,,,, list.getClass () .getMethod (“add",, Object.class) .invoke(列表,1);
,,,,,,,,,,,,,listString.getClass () .getMethod (“add",, Object.class) .invoke (listString,,,,,,,,,,,,,,,,,//,给不服气的读者们的测试之处,你可以改成字符串来尝试。
,,,,,,,,,,,,,listInteger.getClass () .getMethod (“add",, Object.class) .invoke (listInteger, 1);
,,,,,,,,,},catch (Exception e), {
,,,,,,,,,,,,,e.printStackTrace ();
,,,,,,,,,}
,,,,,,,,,System.out.println (“list 大小:“,+,list.size ());
,,,,,,,,,System.out.println (“listString 大小:“,+,listString.size ());
,,,,,,,,,System.out.println (“listInteger 大小:“,+,listInteger.size ());
,,,,,}
}>之前才能
不好意思,有图有真相,我就是插进去了,要是你还不信,我还真没办法了。
探索真相
上述的就是泛型擦除的一种表现了,但是为了更好的理解,当然要更深入了是吧。虽然
<代码> 代码>列表很大,但却也不是不能看看。
两个关键点,来验证一下:
<李>数据存储类型李>
<李>数据获取李>
//<>之前,还以为,先来看看画了一个大饼的列表//才能,能够过很清楚的看到泛型E
public 才能class ArrayList< E>, extends AbstractList,,,,,,,,,, implements List,, RandomAccess,,可克隆,java.io.Serializable {,,,,,,
,,,,,//,第一个关键点,,,,
,,,,,//,还没开始就出问题的存储类型
,,,,,//,难道不应该也是一个泛型E ?
,,,,,transient 对象[],elementData;,,,,,, public E 得到(int 指数),{
,,,,,,,,,rangeCheck(指数),,,,,,,,,,,return elementData(指数);,//,1——比;
,,,,,},,,,,,//,由1直接调用的函数
,,,,,//,第二个关键点,强制转化得来的数据
,,,,,E elementData (int 指数),{,,,,,,,,,return (E), elementData(指数);
,,,,,}
}>之前才能
我想,其实你也能够懂了,这个所谓的泛型
<代码> T 代码>最后会被转化为一个
代码> <代码>对象,最后又通过强制转化来进行一个转变。从这里我们也就能够知道为什么我们的数据从前面过来的时候,
<代码> 代码字符串类型数据能够直接被
<代码>整数代码>进行接收了。
带来什么样的问题?
这个问题的结果我们已经在上述文章中提及到了,通过反射的方式去进行插入的时候,我们的数据就会发生错误。
如果我们在一个
<代码> List 代码>中在不知情的情况下插入了一个
<代码> 代码字符串类型的数的值,那这种重大错误,我们该找谁去说呢。
上面的问题中,我们已经说过了
<代码> T> 代码将在后期被转义成
<代码>对象>