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

积木(01)

泛型

使用传统的方法的缺点:

  • 不能对加入到集合中的数据类型进行约束(不安全)

  • 遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响

    ArrayList arryList = new ArrayList();

说明:

  • ArrayList 表示放到ArrayList 集合中的元素都是Dog类型

  • 如果编译器发现添加的类型不满足要求,就会报错

  • 在遍历的是,可以直接去除Dog类型,而不是Object

泛型的好处

  • 编译时,检查添加的元素类型,提高了安全性

  • 减少了类型转换的次数,提高了效率

泛型介绍

  • 泛型又称参数化类型,是JDK5.0 出现的新特性,解决数据类型的安全性问题

  • 在类声明或实例化时子只要指定好需要的具体的类型即可

  • Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁,健壮

  • 泛型的作用是:可以在类声明时通过一个标识表示类中某个元素的类型,或者是某个方法的返回值的类型,或者是参数的类型

    //E 表示 s的数据类型,该数据类型是在定义Person对象的时候指定的,即在编译期间就确定E是什么类型
    class Person{
    E s;
    public Person(E s){
    this.s = s;
    }
    public E f(){
    return s;
    }
    }

泛型语法

  • 泛型的声明

    • interface 接口 {}

    • class 类<K,V>{}

    • 其中,T,K,V不代表值,而是表示类型

    • 任意字母都可以。常用T表示,是Type的缩写

  • 泛型的实例化

注意细节

  • <>里面只能是引用类型

  • 在指定泛型具体类型后,可以传入该类型或者其子类型

  • 实际开发中

    • ArrayList a = new ArrayList<>();

    • 后面会把<>里面的内容省略

自定义泛型

class Tiger<T,R,M>{

}
  • Tiger 后面泛型,所以我们把Tiger就称为自定义泛型类

  • 范式的标识符,一般都是大写字母

  • 泛型标识符可以有多个

  • 普通成员可以使用泛型(属性,方法)

  • 使用泛型的数组不能初始化

    • 类型没有确定下来,编译器不知道开多大空间
  • 静态方法不能使用泛型

    • 因为静态是和类相关的,在类加载时,对象还没创建

自定义泛型接口

  • 接口中,静态成员也不能使用泛型

  • 泛型接口的类型在继承接口或者实现接口时确定

  • 没有指定类型,默认Objec

自定义泛型方法

  • 基本语法

    • 修饰符 <T,R> 返回类型 方法名(参数列表){}
  • 泛型方法,可以定义在普通类中,也可以定义在泛型类中

  • 当泛型方法被调用时,类型会确定

  • public void eat(E e){}

    • 修饰符后面没有<>

    • 该方法不是泛型方法,而是使用了泛型

泛型的继承和通配符

//不允许这样写
List<Object> list = new ArrayList<String>();

通配符

  • <?> 支持仍以泛型类型
  • <? extend A> 支持A类以及A类的子类,规定了泛型的上限
  • <? super A>支持A类以及A类的父类,不限于直接父类,规定了泛型的下限

栈和队列

基本理解:Stack 是一个类,可以直接创建对象

Queue

基本理解:Queue是一个接口,不能直接实现

  • 访问第一个元素

    • peek (安全)

    • element(不安全)

  • 出队

    • poll(安全)

    • remove(不安全)

  • 入队

    • offer(安全)

    • add(不安全)

内部类

内部类表示的事物是外部类的一部分

内部类单独出现没有任何意义

比如说:迭代器

内部类的访问特点

  • 内部类可以直接访问外部类的成员,包括私有

  • 外部类要访问内部类的成员,必须创建对象

匿名内部类

本质:隐藏了名字的内部类
在这里插入图片描述

使用场景:当方法的参数是接口或者类时,并且这个接口或者是对象只使用一次,就可以用匿名内部类


http://www.kler.cn/a/466612.html

相关文章:

  • Redis--高可用(主从复制、哨兵模式、分片集群)
  • 《数据结构》期末考试测试题【中】
  • 嵌入式linux中socket控制与实现
  • 连接Milvus
  • 使用 OpenAI 进行结构化标签提取的 Python 实现
  • windows中硬件加速gpu计划开启cpu的使用率居高不下
  • @Transactional注解 细节!
  • 检索增强生成(RAG):大语言模型的创新应用
  • LeetCode 141:环形链表
  • C++面向对象编程:纯虚函数、抽象类、虚析构、纯虚析构
  • 【项目】多模态图文理解-GLM-Edge实战
  • Scala_【5】函数式编程
  • 以太网连接,本地连接,宽带连接,无线WLAN连接;交换机和路由器
  • 【MyBatis-Plus 条件构造器】全面解析 Wrapper
  • 【赵渝强老师】MongoDB文档级别的并发控制
  • vue 虚拟滚动 vue-virtual-scroller RecycleScroller
  • logback日志文件多环境配置路径
  • Linux下读取Windows下保存的文件,报错信息中出现“^M“时如何解决?【由于Windows和Linux的换行方式不同造成的-提供两种转换方式】
  • React18路由和Vue3路由进行对比
  • [2024] 如何以 5 种可行的方式在Android中打开 HEIC 文件?
  • aardio —— 虚表 —— 模拟属性框
  • Edge Scdn的应用场景有哪些?
  • VScode SSH 错误:Got bad result from install script 解決
  • CG顶会论文阅读|《科技论文写作》硕士课程报告
  • FreeSWITCH dialplan/default.xml 之释疑
  • 如何删除 Android 设备上的应用程序 | 3种高效方法