抖音二面栽在泛型擦除?答应我,别和我倒在同一地方!

  前言   

这是我在抖音二面的时候自我感觉没有答好的一题,因为我的中心只是围绕在了   <代码> 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> 对象>

抖音二面栽在泛型擦除?答应我,别和我倒在同一地方!