码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 《Effective Java》知识点(4)--泛型


    26. 请不要使用原生态类型

          原生态类型是不带任何实际类型参数的泛型名称。原生态类型只是为了与引入泛型之前的遗留代码进行兼容和互用而提供的。

          如果使用原生态类型,就失掉了泛型在安全性和描述性方面的所有优势。使用原生态类型会在运行时导致异常,所以不要使用。如Set和Set是安全的,而Set是不安全的。

          例外,一是必须在类文字(class literal)中使用原生态类型,如List.class;二是instanceof操作符需要使用原生态类型。

    27. 消除非受检的警告

          警告类型:

    a. 非受检转换(cast)警告

    b. 非受检方法调用警告

    c. 非受检参数化可变参数类型警告

    d. 非受检转换(conversion)警告

          规则:

    a. 要尽可能地消除每一个非受检警告

    b. 如果无法消除警告,同时可以证明引起警告的代码是类型安全的,才可以用一个@SuppressWarnings("unchecked")注解来禁止这条警告。

    c. 应该始终在尽可能小的范围内使用@SuppressWarnings,不要在整个类上使用。每当使用@SuppressWarnings都要添加一条注释,说明为什么这么做是安全的。

    28. 列表优于数组

    数组与泛型的不同:

    a. 数组是协变的,如果Sub是Super的子类型,那么Sub[]就是Super[]的子类型;而泛型是可变的,List不是List的子类型。

    b. 数组是具体化的,在运行时知道它们的元素类型;而泛型在运行是擦除元素类型的。

    因此数组提供了运行时的类型安全,但没有编译时的类型安全,而泛型则相反。

    创建泛型数组是非法的。当数组与泛型混合使用遇到编译时错误或警告时,应该优先用泛型List。

    29. 优先考虑泛型类

          使用泛型类比使用需要在客户端代码中进行转换的类型来得更加安全,也更容易。

    30. 优先考虑泛型方法

           静态工具方法尤其适合泛型化。泛型方法和泛型类一样,使用起来比要求客户端转换输入参数并返回值的方法来得更加安全。

    31. 利用有限制通配符来提升API的灵活性

         表示E的某个子类型 ,表示E的某种超类。

         为了获得最大限度的灵活性,要在表示生产者(提供对象)或者消费者(接收对象)的输入参数上使用通配符类型。PECS表示producer-extends,consumer-super。所有的comparable和comparator都是消费者。

          不要用通配符类型作为返回类型。

          如果类型参数只在方法声明中出现一次,就可以用通配符取代它。

    32. 谨慎混用泛型和可变参数

    32.1 缺点

            当可变参数有泛型或参数化类型时,编译警告信息会产生混乱。

            当一个参数化类型的变量指向一个不是该类型的对象时,会产生堆污染。它导致自动生成转换失败,破坏了泛型系统的基本保证。

    32.2 泛型可变参数方法在下列条件下是安全的:

            a. 它没有在可变参数数组中保存任何值。将值保存在泛型可变参数数组参数中是不安全的。

            b. 它没有对不被信任的代码开发该数组。允许另一个方法访问一个泛型可变参数数组是不安全的。

    32.3 如果选择编写带有泛型或者参数化可变参数的方法,首先要确保该方法是类型安全的,然后用@SafeVarargs对它进行注解。

    33. 优先考虑类型安全的异构容器

           所谓异构,就是所有键(key)都是不同类型的。将类型参数放在键上(即key参数化),而不是容器上,来获得可以保存不同类型对象的容器。一般用Class对象作为键, Class对象称作类型令牌。你也可以使用定制的键类型。

  • 相关阅读:
    后台返回前端 is....开头字段被屏蔽
    PyTorch模型定义 | 模型容器 | 模型块 | 修改模型 | 模型读取与保存
    python 编写简单的程序解释器(十一)
    Wpf知识小结
    借助适用于 Android 的 Material 运动效果构建精美的过渡
    java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化
    强化学习 补充笔记(TD算法、Q学习算法、SARSA算法、多步TD目标、经验回放、高估问题、对决网络、噪声网络)
    Linux ARM平台开发系列讲解(自旋锁) 3.3.1 Linux内核自旋锁描述
    Spring Cloud Alibaba【认识分布式事物、分布式事务产生的场景、什么是两阶段提交、XA方案、Seata方案、业务说明、下载启动Seata服务】(十)
    java计算机毕业设计ssm宠物店管理系统element vue前后端分离
  • 原文地址:https://blog.csdn.net/myepicure/article/details/132978174
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号