Java -泛型

news2024/11/26 18:27:14

认识泛型

  • 定义类,接口,方法时,同时声明了一个或者多个类型变量(如:<E>)

    称为泛型类,泛型接口,泛型方法,他们统称为泛型。

public class ArrayList<E>{
    .....
}
  • 作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!

    这样可以避免强制类型转换,及其可能出现的异常。

    package YMP.genericity;
    ​
    import java.util.ArrayList;
    ​
    public class GenericDemo01 {
        public static void main(String[] args) {
            //目标:认识泛型,搞清楚泛型的好处
            ArrayList<String> list=new ArrayList<String>();
            list.add("java");
            list.add("php");
            /*list.add(23);
            list.add(99.9);
            list.add(true);
            list.add('a');
            list.add(new Object());*/
    ​
    ​
            //获得数据
            for(int i=0;i<list.size();i++){
                /*Object rs=list.get(i);
                //把数据类型进行转型
                String s=(String) rs;*/
    ​
                String s=list.get(i);
                System.out.println(s);
            }
        }
    }
    ​

  • 泛型的本质:把具体的数据类型作为参数传给类型变量。

泛型类

修饰符 class 类名 <类型变量,类型变量,...>{
    
}

  • 注意:类型变量建议用大写的英文字母,常用的有:E,T,K,V等。

package YMP.genericity;
​
public class GenericDemo02 {
    public static void main(String[] args) {
        //目标:学会自定义泛型类
        //需求:请您模拟ArrayList集合自定义一个集合MyArrayList
​
        MyArrayList<String> mylist=new MyArrayList<>();//JDK1.7 之后,后面的类型可以省略
​
        mylist.add("hello");
        mylist.add("world");
       // mylist.add(555);
        mylist.add("java");
        mylist.add("前端");
​
        System.out.println(mylist.remove("world"));
​
        System.out.println(mylist);
​
​
    }
}
​

package YMP.genericity;
​
import java.util.ArrayList;
​
//泛型类
public class MyArrayList<E> {
​
    private ArrayList list=new ArrayList();
​
    public boolean add(E e){
        list.add(e);
        return true;
    }
​
    public boolean remove(E e){
        return list.remove(e);
​
    }
​
    @Override
    public String toString() {
        return list.toString();
    }
}
​

泛型接口

修饰符 interface 接口名<类型变量,类型变量,...>{
    
}
  • 注意:类型变量建议用大写的英文字母,常用的有:E,T,K,V等。

package YMP.genericity.Demo03Generic;
​
public class GenericDemo03 {
    public static void main(String[] args) {
        //目标:搞清楚泛型接口的基本作用
        //需求:项目需要对学生老师数据都要进行增删改查操作
​
        StudentData studentData=new StudentData();
        studentData.add(new Student());
​
        studentData.delete(new Student());
        Student s=studentData.query(1);
​
​
​
​
    }
}
​
​

package YMP.genericity.Demo03Generic;
​
public class Student {
}
​
package YMP.genericity.Demo03Generic;
​
public class Teacher {
}
​

package YMP.genericity.Demo03Generic;
​
public interface Data <T>{
    void add(T t);
​
    void delete(T t);
​
    void update(T t);
​
    T query(int id);
}
​

package YMP.genericity.Demo03Generic;
​
public class StudentData implements Data<Student>{
    @Override
    public void add(Student student) {
​
    }
​
    @Override
    public void delete(Student student) {
​
    }
​
    @Override
    public void update(Student student) {
​
    }
​
    @Override
    public Student query(int id) {
        return null;
    }
}
​
​
​
​
​
package YMP.genericity.Demo03Generic;
​
public class TeacherData implements Data<Teacher>{
    @Override
    public void add(Teacher teacher) {
​
    }
​
    @Override
    public void delete(Teacher teacher) {
​
    }
​
    @Override
    public void update(Teacher teacher) {
​
    }
​
    @Override
    public Teacher query(int id) {
        return null;
    }
}
​

泛型方法,通配符,上下限

泛型方法

修饰符<类型变量,类型变量,...>返回值类型 方法名(形参列表){
    
}

package YMP.genericity.Demo04Generic;
​
import YMP.genericity.Demo03Generic.Student;
​
public class GenericDemo04 {
    public static void main(String[] args) {
        //目标:学会定义泛型方法,搞清楚作用
        //需求:打印任意数组的内容
        String[] names={"张三","李四","王五"};
        printArray(names);
​
        Student[] stus=new Student[3];
        printArray(stus);
​
        Student max=getMax(stus);
        String max2=getMax(names);
​
​
​
    }
    public static <T> void printArray(T[] names){
​
    }
    public static <T> T getMax(T[] names){
        return  null;
​
    }
​
}
​

通配符

  • 就是 “?” ,可以在“使用泛型”的时候代表一切类型;E T K V 是在定义泛型的时候使用。

泛型的上下限

  • 泛型上限:?extends Car:?能接收的必须是Car或者其子类。

  • 泛型下限:?super Car:?能接收的必须是Car或者其父类。

package YMP.genericity.Demo04Generic;
​
import java.util.ArrayList;
​
public class GenericDemo05 {
    public static void main(String[] args) {
        //目标:理解通配符和上下限
        ArrayList<Xiaomi> xiaomis=new ArrayList<>();
        xiaomis.add(new Xiaomi());
        xiaomis.add(new Xiaomi());
        xiaomis.add(new Xiaomi());
​
        go(xiaomis);
​
        ArrayList<BYD> byds=new ArrayList<>();
        byds.add(new BYD());
        byds.add(new BYD());
        byds.add(new BYD());
​
        go(byds);
​
/*        ArrayList<Dog> dogs=new ArrayList<>();
        dogs.add(new Dog());
        dogs.add(new Dog());
        dogs.add(new Dog());
​
        go(dogs);*/
​
    }
    //需求:开发一个极品飞车的游戏
    //虽然Xiaomi和BYD是Car的子类,但是ArrayList<Xiaomi>  ArrayList<BYD> 和 ArrayList<Car>没有半毛钱光系!
​
    //**泛型的上下限**
    //
    //* 泛型上限:?extends Car:?能接收的必须是Car或者其子类。
    //* 泛型下限:?super Car:?能接收的必须是Car或者其父类。
    public static void go(ArrayList<?extends Car> cars){
​
    }
}
​

package YMP.genericity.Demo04Generic;
​
public class Xiaomi extends Car{
}
​
​
package YMP.genericity.Demo04Generic;
​
public class LX extends Car{
}
​
​
package YMP.genericity.Demo04Generic;
​
public class BYD extends Car{
}
​
​
package YMP.genericity.Demo04Generic;
​
public class Dog {
}
​
​

泛型支持的类型

  • 泛型不支持基本数据类型,只能支持对象数据类型(引用数据类型)。

包装类

  • 包装类就是把基本类型的数据包装成对象的类型

自动装箱:基本数据类型可以自动转换为包装类型。

自动拆箱:包装类型可以自动转换为基本数据类型。

package YMP.genericity.Demo05Generic;
​
import java.util.ArrayList;
​
public class GenericDemo06 {
    public static void main(String[] args) {
        //目标:泛型和集合都不支持基本数据类型(引用数据类型)
        /*ArrayList<int> list=new ArrayList<>();*/
​
        //泛型擦除:泛型工作在编译阶段,等编译后泛型就没用了,所以泛型在编译后就会被擦除。
        //所有类型会回复为Object,Object是对象类型只能指向对象,不能接基本数据类型
​
        //把基本数据类型包装类对象
        //手工包装
        //Integer i=new Integer(100);//过时
        Integer it1=Integer.valueOf(100);//推荐
        Integer it2=Integer.valueOf(100);//推荐
​
        System.out.println(it1==it2);//true
​
        Integer it3=Integer.valueOf(130);
        Integer it4=Integer.valueOf(130);
​
        System.out.println(it3==it4);//false
​
​
        //Integer中已经封装了-128~127的数字,所以it1和it2指向的是同一地址
        //而it3和it4已经超出127,所以指向的不是同一地址
​
        //自动装修:基本数据类型可以直接变成包装对象的数据,不需要额外做任何事情
        Integer it11=100;
        Integer it22=100;
​
        System.out.println(it11==it22);//true
​
        Integer it33=130;
        Integer it44=130;
​
        System.out.println(it33==it44);//false
​
​
        //自动拆箱:把包装类的对象直接给基本数据类型
        int i=it11;
        System.out.println(i);
​
        ArrayList<Integer> list=new ArrayList<>();
        list.add(130);//自动装箱
        list.add(120);
​
        int rs=list.get(1);//自动拆箱
​
        System.out.println("----------------------------------");
​
​
        //包装类新增的的功能
        //1.把基本类型的数据转换为字符串
​
        int j=23;
        String rs1=Integer.toString(j);//"23"
        System.out.println(rs1+1);//231
​
        Integer i2=j;
        String rs2=i2.toString();//"23"
        System.out.println(rs2+1);//231
​
        String rs3=j+"";
        System.out.println(rs3+1);//231
​
​
        System.out.println("----------------------------------");
​
​
        //把字符串数值转换为对应的基本数据类型
        String str="98";
        //int i1=Integer.parseInt(str);
        int i1=Integer.valueOf(str);
        System.out.println(i1+2);
​
        String str2="98.8";
        double d=Double.valueOf(str2);
        System.out.println(d+2);
​
​
​
​
​
​
​
​
    }
}
​

包装类具备的其他功能

  • 可以把基本类型的数据转化为字符串类型。

    public static String toString(double d)
    public String toString()

  • 可以把字符串类型的数值转换为数值本身对应的真实数据类型。

    public static int parsenInt(String s)
    public static Integer valueOf(String s)

小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式软件--数电基础 DAY 3

一、二进制 &#xff08;1&#xff09;文字表述 二进制数只能取0&#xff0c;1两个数字&#xff0c;逢二进一。 通过二进制表达文字。如战争时代的电报。 通过电灯泡的亮灭传递出信息。可以对灯亮和灯灭富裕一些含义&#xff0c;就能传达出想要的消息。 这就是编码和解码两…

[uview3]Popup 弹出层

项目场景&#xff1a;展会管理系统&#xff0c;通过弹出层的方式切换展会项目&#xff0c;效果如下&#xff1a; 弹出部分代码&#xff1a; 注意点&#xff1a;层级要设高一点&#xff0c;可能会其他元素遮挡出不来 <view style"z-index: 999"><up-popup …

轻度自闭症的温柔启航:星启帆的康复之旅

在儿童成长的道路上&#xff0c;自闭症作为一种复杂的神经发展障碍&#xff0c;给许多家庭带来了挑战与困扰。轻度自闭症&#xff0c;作为自闭症谱系中的一个类型&#xff0c;其症状表现相对较轻&#xff0c;但同样需要我们的关注与科学的干预。星启帆自闭症儿童康复机构&#…

叉车AI防撞预警系统 主动防撞 司机危险行为报警

叉车作为物料搬运设备中的主力军&#xff0c;叉车在港口、车站、机场、货场、工厂车间、仓库、流通中心和配送中心等场所大显身手&#xff0c;替代人工作业大大提高搬运效率。但其工作环境通常比较复杂&#xff0c;有时处于人车混杂的同一空间&#xff0c;作业安全高度依赖驾驶…

千元护眼台灯大PK,书客、爱德华医生和柏曼护眼台灯哪个好?

在当今社会&#xff0c;孩子们面临着越来越大的学习压力大&#xff0c;在追求学业成就的同时&#xff0c;我们也应关注学习环境对视力健康的影响。说到护眼&#xff0c;多在户外运动当然是很多人觉得的最佳选项&#xff0c;但很多时候&#xff0c;因为条件限制&#xff0c;学生…

充电宝是有线的好还是无线的好?适合大学生平价充电宝有哪些?

平价的充电宝推荐我当然是首选无线磁吸的啦&#xff0c;因为我自己也是有三十多款充电宝的测评经验了&#xff0c;之前总是用着有线的充电宝&#xff0c;就是会有各种麻烦&#xff0c;比如上下班通勤的时候&#xff0c;数据线总是给路边各种东西钩住&#xff0c;路过的电动车什…

数据结构——排序(3):交换排序(续)

目录 一、快速排序 (1)hoare版本 ①思路 ②过程图示 ③思考 ④代码实现 ⑤代码解释 &#xff08;2&#xff09;挖坑法 ①思路 ②过程图示 ③思考 ④代码实现 ⑤代码解释 &#xff08;3&#xff09;lomuto前后指针 ①思路 ②过程图示 ③思考 ④代码实现 ⑤代…

在写PWM风扇驱动之前:如何透过FG信号,获取风扇转速?

文章目录 一、前言二、风扇规格2.1 线序2.2 FG 信号说明 三、FG公式推导四、软件算法解析4.1 HZ 的概念4.2 算法 五、篇尾 一、前言 PWM风扇也是日常SOC智能设备开发中常见的外围小设备&#xff0c;而对于驱动工程师而言&#xff0c;主要工作就是实现风扇的控制驱动&#xff0…

一文了解什么是全息光学元件?

全息光学元件&#xff08;holographic optical elements&#xff1b;HOE&#xff09;是根据全息术原理制成的光学元件。通常做在感光薄膜材料上。作用基于衍射原理&#xff0c;是一种衍射光学元件。不像普通光学元件&#xff0c;用透明的光学玻璃、晶体或有机玻璃制成&#xff…

Leetcode JAVA刷刷站(34)排序数组中查找元素的首尾位置

一、题目概述 二、思路方向 为了设计一个时间复杂度为 O(log n) 的算法来找到目标值在已排序数组中的开始位置和结束位置&#xff0c;我们可以使用二分查找的变种。首先&#xff0c;我们可以使用二分查找来找到目标值在数组中的任意一个位置&#xff08;如果存在的话&#xf…

linux下对目录文件进行操作(打开目录,读取目录项,关闭目录),进入目录的函数chdir,七篇文件I/O文章小结

目录文件介绍 目录也是一种文件&#xff0c;因此操作流程与普通文件类似&#xff0c;有诸如打开、关闭、定位等概念&#xff0c;但目录是一种特殊的文件&#xff0c;目录存储的数据的最小单位并不是字符&#xff0c;而是目录项。这使得目录跟普通文件又有区别。目录项指的是结…

基于resttemplate实现微服务调用

子工程搭建与管理 新建一个cloud模块来作为公共模块&#xff0c;cloud模块中将管理用于微服务使用各个组件 euerka中的配置 package com.lingyang.euerka.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configu…

【Python快速入门和实践018】Python常用脚本-图片合成视频

一、功能介绍 这段代码定义了一个名为 create_video_from_images 的函数&#xff0c;用于将一个文件夹中的图像序列合并成一个视频文件。以下是该函数的主要功能和组成部分的分析&#xff1a; 函数参数 input_folder: 包含图像文件的文件夹路径。output_file: 输出视频文件的…

马斯克发布Grok-2:实时获取X资讯、多模态支持,性能追平GPT-4o

在LLM&#xff08;大型语言模型&#xff09;竞争中&#xff0c;马斯克的XAI无疑是一个强劲的对手。继宣布斥资数十亿美元购买英伟达H100 GPU用于训练自家模型后&#xff0c;XAI迅速推出了其最新的大模型——Grok-2。这一模型不仅在技术性能上对标OpenAI、Anthropic等主流大模型…

Hystrix——服务容错保护库

熔断机制是解决微服务架构中因等待出现故障的依赖方响应而形成任务挤压&#xff0c;最终导致自身服务瘫痪的一种机制&#xff0c;它的功能类似电路的保险丝&#xff0c;其目的是为了阻断故障&#xff0c;从而保护系统稳定性。Hystrix作为Spring Cloud中实现了熔断机制的组件&am…

(亲测有效)SpringBoot项目集成腾讯云COS对象存储(2)

接上文&#xff08;亲测有效&#xff09;SpringBoot项目集成腾讯云COS对象存储&#xff08;1&#xff09;-CSDN博客 目录 3、通用能力类 文件下载 测试 3、通用能力类 文件下载 官方文档介绍了2种文件下载方式。一种是直接下载 COS 的文件到后端服务器&#xff08;适合服务…

前端Mac解决localhost冲突问题!!!

1、报错提示&#xff1a; 运行项目的时候遇到了如下的问题&#xff0c;导致我项目运行不起来&#xff0c;查阅了一下资料发现是loaclhost有误 2、ping一下localhost 先打开终端&#xff0c;在终端输入命令&#xff1a;&#xff08;我输入这个命令的时候能ping通&#xff0c;当…

Android 使用`layer-list`打造精美的背景

引言 在 Android 开发中&#xff0c;layer-list 是一种强大的工具&#xff0c;可以帮助我们创建复杂的背景图形&#xff0c;&#x1f3a8; 这种方法可以大大提升应用的视觉效果。作为一名Android开发&#xff0c;理解和掌握 layer-list 的使用不仅可以让我们在 UI 设计上更加灵…

C++竞赛初阶L1-11-第五单元-for循环(25~26课)519: T454430 人口增长问题

题目内容 假设目前的世界人口有 x 亿&#xff0c;按照每年 0.1% 的增长速度&#xff0c;n 年后将有多少人&#xff1f; 输入格式 一行两个正整数 x 和 n&#xff0c;之间有一个空格。其中&#xff0c;1≤x≤100,1≤n≤100。 输出格式 一行一个数&#xff0c;表示答案。以亿…

【C++ 面试 - 基础题】每日 3 题(十八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…