码农知识堂 - 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对象称作类型令牌。你也可以使用定制的键类型。

  • 相关阅读:
    云备份——服务器业务处理模块以及网络通信模块
    java学生成绩管理信息系统
    测试大语言模型在嵌入式设备部署的可能性——模型TinyLlama-1.1B-Chat-v1.0
    数据分析思维-分析方法(基础)
    C51 - 定时器
    C++查漏补缺与新标准(C++20,C++17,C++11)01 C++快速回顾(一)
    我的NPI项目之Android Camera (一) -- Camera选型
    二维数组与二级指针是好朋友吗?
    2022亚太杯数学建模比赛准备
    若依:用sqlite3随便掰饬掰饬
  • 原文地址:https://blog.csdn.net/myepicure/article/details/132978174
    • 最新文章
    • 沪漂五周年了:我越来越迷茫了
      Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
      MySQL-Seconds_behind_master的精度误差
      [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
      AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
      Agent OS :五种驯服不确定性的范式
      PortSwigger SQL注入LAB11
      数据库即时编译JIT
      [Begin]AI Learn Data Day 0
      深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    小工具 小游戏
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

    京公网安备 11010502049817号