zoukankan      html  css  js  c++  java
  • java中的泛型类型擦除

    大家好,我是雄雄,今天给大家分享的是:java的泛型是类型擦除的。

    写在前面

    那么何为类型擦除?类型擦除就是在编译期明确去掉所编程序的类型系统。啥?还不明白?以java泛型为例,java的泛型在编译期有效,在运行期被删除,下面我们来具体的看看。

    先举例一段代码:

    public class Test {
      
      public void method(String [] strs){}
      public void method(int [] ints){}
      
      public void listmethod(List<String> strList){}
      public void listmethod(List<Integer> intList){}
    
    }

    以上这段代码很简单,我们写了4个方法,其中method的两个方法的参数类型不一样,listmethod方法的参数类型也不一样,理论上来说,method的两个方法和listmethod的两个方法都可以构成方法重载,但是,这样写对吗?

    这样写编译无法通过。报错的地方就在listmethod方法上,报错信息为:

    这个错误的意思就是,listmethod<List<String>方法在编译时擦除类型后为listmethod<List<E>与另一个方法重复(listmethod<List<Integer>),也就是说方法名一样,注意这里的一样是指方法名和参数都一样,故报错。

     

    这就是java泛型擦除类型引起的问题,在编译后所有的泛型都会做出相应的转化,可以总结为如下转换规则:

    • List<String>、List<Integer>、List<T>擦除后的类型为List。

    • List<String[]>擦除后的类型为List[]。

    • List<? extends E>、List<? superE>擦除后的类型为List<E>。

    • List<T extends Serializable &Cloneable>擦除后的类型为List< Serializable >

     

    看完以上规则之后你是否明白了上面代码为什么会报编译错误呢?

     

    辣椒酱了哈,年底冲销量了,满80减15了,单件商品下单立减1.88元,时间有限!

    本文参考自:《编写高质量代码 改善java程序的151个建议》

    作者:秦小波

    往期精彩

    投资理财要趁早,基金风险是最小!

    2021-01-10

    一百馒头一百僧,大僧三个更无争,小僧三人分一个,大小和尚得几丁?

    2021-01-09

    你们好好的学,回头教教我~

    2021-01-08

    辣椒酱中奖说明~

    2021-01-07

    点分享

    点点赞

    点在看

  • 相关阅读:
    典型用户
    站立会议5
    站立会议4
    《构建之法》阅读笔记05-需求分析
    站立会议3
    编写Android程序Eclipse连不上手机。
    站立会议2
    站立会议1
    第七周学习进度
    shiro之 散列算法(加密算法)
  • 原文地址:https://www.cnblogs.com/a1111/p/14877325.html
Copyright © 2011-2022 走看看