码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Effective Java学习笔记---------泛型


    术语

    参数化的类型:List
    实际类型参数:String
    泛型:List
    形式类型参数:E
    无限通配符类型:List
    原生态类型:List
    有限制类型参数:
    递归类型限制:>
    有限制通配符类型:List
    泛型方法:static List asList(E[] a)
    类型方法:String.class

    不要使用原生态类型

    泛型:声明中具有一个或多个类型参数的类 或接口

    原生态类型会失去泛型在安全性和描述性方面的优势

    消除非受检的警告,不能忽视

    列表优于数组

    优先考虑泛型

    只要时间允许,就要把现有的类型都泛型化

    泛型化类例子

    1. package codeTemplate.effectiveJava.bean;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class Stack {
    5. private List elements;
    6. private int size;
    7. public Stack() {
    8. elements = new ArrayList<>();
    9. }
    10. public void add(E e) {
    11. elements.add(e);
    12. size++;
    13. }
    14. public E pop() {
    15. size--;
    16. return elements.remove(0);
    17. }
    18. public static void main(String[] args) {
    19. Stack stringStack = new Stack<>();
    20. stringStack.add("1");
    21. String element = stringStack.pop();
    22. System.out.println(element);
    23. }
    24. }

    优先考虑泛型方法

    泛型方法的定义

    修饰符  返回值类型 方法名(形参列表){
    。。。。。。
    }
    
    修饰符与返回值类型中间的 泛型标识符 ,是 泛型方法的标志,只有这种格式声明的方法才是泛型方法。
    泛型方法声明时的 泛型标识符  表示在方法可以使用声明的泛型类型。
    与泛型类相同,泛型标识符可以是任意类型,常见的如T,E,K,V 等。
    泛型方法可以声明为 static 的,并且与普通的静态方法是一样的。
    
    1. public static E checkNullAndReturn(E o) {
    2. if (o == null) {
    3. throw new NullPointerException();
    4. }
    5. return o;
    6. }
    7. //使用
    8. String o = Stack.checkNullAndReturn("123");

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

    参数化类型是不变的,如List不是List的子类,List只能放String类型,不能转化成List

    1. public void addAll(List list) {
    2. elements.addAll(list);
    3. }

    使用

    1. //E为Object
    2. Stack stringStack = new Stack<>();
    3. //可以接收String(Object的子类)
    4. stringStack.add("1");
    5. Object element = stringStack.pop();
    6. System.out.println(element);
    7. //可以接收List(符合List)
    8. stringStack.addAll(Arrays.asList(1,2));
    9. 注:

      1. 为了获得最大限度的灵活性,要在表示生产者或者消费者的输入参数上使用通配符类型
      2. PECS:producer-extends,consumer-super
      3. 所有的comparable和comparator都是消费者,Comparable,Comparator

      谨慎并用泛型和可变参数

      可变参数和泛型不能良好地合作

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

      常见泛型

      Set Map,ThreadLocal,AtomicReference,这些都是参数化了的容器,每个容器只能有固定数目的类型参数,可以将类型参数放在键上而不是容器上来避开这一限制。类型安全的异构容器,可以用Class对象作为键,如Map, Object>,其中

      Class是Class的无线通配符,表示可以是任意Class类型

      类型令牌:当一个类的字面被用在方法中,来传达编译时和运行时的类型信息

      1. @Getter
      2. private Map, Object> favorites = new HashMap<>();
      3. public void putFavorite(Class type, E instance) {
      4. favorites.put(type, instance);
      5. }
      6. stringStack.putFavorite(String.class,"123");
      7. System.out.println(stringStack.getFavorites());
      8. //结果
      9. {class java.lang.String=123}

    10. 相关阅读:
      【Linux网络编程】序列化与反序列化
      Python实践项目讲解:如何用制作一个桌面宠物
      控制台实现汽车租赁系统
      【C++ 中的友元函数:解密其神秘面纱】
      实验三:多种影响因素下购房方案的比较
      视频怎么转音频?推荐使用这几种方法
      Java中SpringBoot四大核心组件是什么
      Linux下根目录都包含什么? 每个文件什么作用?
      基于JavaWeb的果蔬生鲜交易系统
      上周热点回顾(2.12-2.18)
    11. 原文地址:https://blog.csdn.net/jsq916/article/details/126705658
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | 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号