当前位置: 首页 > wzjs >正文

自己电脑上做网站别人访问好消息tvapp电视版

自己电脑上做网站别人访问,好消息tvapp电视版,小游戏入口免费游戏,wordpress中文企业模板先说结论 , Java 的泛型是伪泛型 , 在运行期间不存在泛型的概念 , 泛型在 Java 中是 编译检查 运行强转 实现的 泛型是指 允许在定义类 , 接口和方法时使用的类型参数 , 使得代码可以在不指定具体类型的情况下操作不同的数据类型 , 从而实现类型安全的代码复用 的语言机制 . …

先说结论 , Java 的泛型是伪泛型 , 在运行期间不存在泛型的概念 , 泛型在 Java 中是 编译检查 + 运行强转 实现的

泛型是指 允许在定义类 , 接口和方法时使用的类型参数 , 使得代码可以在不指定具体类型的情况下操作不同的数据类型 , 从而实现类型安全的代码复用 的语言机制 .

集合框架和内置函数式接口等内容都使用了泛型 .

通配符

<>泛型类型参数列表 , 可以包含多个参数 .

?通配符 , 可以配合 extends 和 super 关键字表示不明类型的上下限 .

<T> 通常用于泛型类源码声明 , T 作为占位符表示实例化的泛型参数 .

<?> 可以用在实例化上 , 此时泛型参数不明确 , 通常不能写入变量 .

不能 Box<?> box = new Box<?>(); , 但可以声明 Box<?> box = new Box<String>(); , 这样只能安全读取 Object 元素 , 不能写入任何非 null 元素 . new 语句右侧的 <> 叫做钻石操作符 , 钻石操作符的作用是让编译器根据左侧泛型参数推断右侧的实际参数 . 如果左侧是 <?> 参数不明 , 那么右侧则必须显式指定泛型参数 .

通配符写法作用允许读取允许写入
<?>任意类型可以读取为 Object只能写入 null
<? extends T>T 或其子类型(上界)可以读取为 T不能写入具体元素
<? super T>T 或其父类型(下界)只能读取为 Object可以写入 T 或子类型

生产消费原则 ( PECS )

Producer Extends, Consumer Super .

  • 生产者使用 <? extends T> 上界通配符 : 只能读 , 不能写 .
List<? extends Number> list = new ArrayList<Integer>();

list 是 Number 或其子类类型的集合 , 可以安全地将集合元素当作 Number 读取 , 因为确定是 Number 及其子类 .

只能确定泛型参数的上界 , 实际类型不确定 , 所以不允许写入 .

  • 消费者使用 <? super T> 下界通配符 : 只能写 , 读不明白 .
List<? super Integer> list = new ArrayList<Number>();

list 是 Integer 或其父类类型的集合 , 因为 Java 向下转型是安全的 , 所以可以将 Integer 或其子类放入集合 , 因为集合元素类型一定是 Integer 或其父类 .

因为只能确定泛型参数的下界 , 所以编译期将 ? super Integer 擦除成 Object , 且读取时只能保证元素是 Object .

类型擦除

编译器将泛型类型替换成原始类型以保证向后兼容性 ( 兼容不支持泛型的旧版本 Java ) , 向类 , 接口或方法传递的泛型类型参数 类名<类型> 只在编译期存在 , 编译后泛型信息会被擦除 , 生成的字节码文件不包含具体的泛型类型 .

类型参数被擦除为它的第一个边界类型 : 如果是 T , 则擦除为祖宗类 Object , 如果是 T extends 父类 , 则擦除为父类 . 集合中 List<T> 擦除为 List .

List<String> list = new ArrayList<>();
List.add("Hello");
String s = List.get(0);👇
(在字节码中类似于)
List list = new ArrayList();
list.add("Hello");
String s = (String)list.get(0);

instanceof 关键字用于判断对象是否是某个类或其子类的实例 , a instanceof b 作为语句返回布氏值 .

Tips : 基本数据类型不具备继承体系 , 也不是对象 , 不能被泛型的擦除机制处理 , 所以泛型必须使用基本数据类型的包装类 .

类型擦除会导致

  1. 运行时不知道泛型类型 .

    List<String> a = new ArrayList<>();
    List<Integer> b = new ArrayList<>();
    a.equals(b); // true
    a.getClass() == b.getClass() // true
    
  2. 泛型不能用于静态字段 . 因为不同泛型实例在运行时本质上是同一个类 , 它们会共享同一个静态字段 , 如果这个静态字段是泛型参数 T 的 , 那么就会出现实例类型冲突 ( 静态字段只有一份 , 不同实例期望的类型却不同 ) .

  3. 不能用 instanceof 关键字判别泛型类 . 因为不同的泛型类在运行时被擦除为同一个类 , 此时再使用 instanceof 关键字没有任何意义 .

编译期类型检查

仍然以集合为例 , 编译期完成的任务有 :

  1. 检测传入泛型集合的字段类型是否正确 .

    List<String> list = new ArrayList<>();
    list.add("Hello");
    list.add(123); // 编译错误, int 不是 String
    
  2. 取出泛型集合对象时是否能正确映射 .

    int get = list.get(0); // 编译错误, 不能把 String 当作 int
    

类型检查本质是继承链的转换关系 , 前面提到的向上转型机制在通配符 , 类型擦除和类型检查等特性上得到充分实现 .

http://www.dtcms.com/wzjs/373150.html

相关文章:

  • 常熟seo网站优化软件百度推广账号怎么申请
  • 做外贸的社交网站怎么创建自己的网站平台
  • 网站公司排行榜前十名人力资源培训
  • 国外b2b平台网站网站搭建步骤
  • 泰安网站建设课程报告游戏代理怎么找渠道
  • 中国老区建设促进会网站博客可以做seo吗
  • 重庆招聘58同城sem和seo哪个工作好
  • 宜昌建站刷排名有百度手机刷排名
  • 英文网站建设解决方案成人馆店精准引流怎么推广
  • 响应式网站居中营销策划运营培训机构
  • 天津市建设优化网站排名公司
  • 广州高端网页制作合肥seo网络营销推广
  • 网站建设编辑工作总结网站seo怎么操作
  • 网站服务器 64位推广下载app赚钱
  • 做app网站需要什么如何制作微信小程序店铺
  • 垃圾网站怎么做的网店运营流程步骤
  • wordpress 全站pjax关键词推广优化排名如何
  • 国家知识产权局专利检索系统西安网站建设优化
  • 自己的网站怎么做跳转网站排名掉了怎么恢复
  • 网站名字备案流程合肥seo网站管理
  • 红酒专业网站建设百度知道官网
  • 网站将导航条不滚动怎么做广告公司招聘
  • 网站商城方案seo做的比较牛的公司
  • 如何保护自己的网站杭州网络推广网络优化
  • 新浪 博客可以做网站优化吗seo优化技巧
  • 海口网站建设多少钱百度爱采购优化软件
  • ps做网站教程百度app交易平台
  • 网站样式有哪些风格seo难不难学
  • app下载app开发公司seo网络推广外包公司
  • wordpress 删除自豪的石家庄网站seo外包