进入泛型的世界

泛型的理解和好处

泛型的好处

  • 编译时,检查添加元素的类型,提高了安全性
  • 减少了类型转换的次数,提高效率
    不使用泛型
    Dog-加入->Object-取出->Dog(向下转型) Dog放入到ArrayList 会先转成Object,在转出时,还需要转换成Dog
    使用泛型
    Dog->Dog->Dog 放入和取出时,不需要类型转换,提高效率
  • 不再提示编译警告

泛型的介绍

泛型:广泛类型

  • 泛型又称参数化类型,是JDK5.0 出现的新特性,解决数据类型的安全性问题
  • 在类声明或实例化时(在定义对象时,即编译期间),只要指定好需要的具体类型即可
  • Java 泛型可以保证如果程序在编译时,没有发出警告,运行时就不会产生,ClassCastException异常。同时,代码更加简洁
  • 泛型的作用:可以在类声明时通过一个标识表示类中某个属性的类型,或者某个方法的返回值类型,或者是参数类型
public class Generic01 {
    public static void main(String[] args) {
        //注意:E 具体的数据类型在定义Person对象时指定(即在编译期间),就确定E是什么类型
        Person<Integer> integerPerson = new Person<>(1);//E的数据类型是Integer
        integerPerson.show();
    }
}
//泛型的作用:可以在类声明时通过一个标识表示类中某个属性的类型、某个方法的返回值类型 或 参数类型
class Person<E>{
    E S;//E表示s的数据类型,该数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型

    public Person(E s) {//E也可以是参数类型
        S = s;
    }
    public E f(){//E也可以是返回类型
        return S;
    }
    public void show(){
        System.out.println("S的运行类型="+S.getClass());
    }
}

结果
在这里插入图片描述

泛型的语法

泛型的声明

  • interface 接口{} 和 class类<K,V>{}
    1,其中 T K V 不代表值,而是表示类型
    2,任意字母都可以,常用T表示,是Type的缩写

泛型的实例化

要在类名后面指定类型参数的值(类型)。如:

  • 1,List strList = new ArrayList();
  • 2,Iterator iterator = customers.iterator();

泛型使用实例

在这里插入图片描述

public class GenericExercise {
    public static void main(String[] args) {
        //使用泛型方式给HashSet放入三个学生对象,遍历时可以直接调用Student1中的方法
        Set<Student1> objects = new HashSet<Student1>();
        objects.add(new Student1("jack"));//当调用add方法时,显示调用Student1 对象
        objects.add(new Student1("tom"));
        objects.add(new Student1("smith"));

        // 遍历
        for(Student1 o:objects){
            System.out.println(o.getName());
        }
        //使用泛型方式给 HashMap 放入 3 个学生对象
        //K -> String V->Student
        //一旦添加了泛型,编译器就会规范调用类型
        Map<String, Student1> map = new HashMap<String, Student1>();
        //public class HashMap<K,V> {}

        Student1 student1 = new Student1("jack");
        Student1 student2 = new Student1("tom");
        Student1 student3 = new Student1("smith");
        map.put("jack",student1);
        map.put("tom",student2);
        map.put("smith",student3);

        //遍历
        //迭代器 EntrySet
        /*
        public Set<Map.Entry<K,V>> entrySet() {
            Set<Map.Entry<K,V>> es;
             return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
        }
        */
        //1,map.entrySet();
        Set<Map.Entry<String, Student1>> entries = map.entrySet();

        /*
        public final Iterator<Map.Entry<K,V>> iterator() {
                return new EntryIterator();
        }
        */
        //2,调迭代器 entries.iterator()
        Iterator<Map.Entry<String, Student1>> iterator = entries.iterator();
        //3,先判断hasNext  下一个是否还有
        while (iterator.hasNext()) {
            Map.Entry<String, Student1> next = iterator.next();
            System.out.println(next.getKey()+"-"+next.getValue());
        }
    }
}
class Student1{
    private String name;

    public Student1(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Student1{" +
                "name='" + name + '\'' +
                '}';
    }
}

结果
在这里插入图片描述

泛型的注意事项

  • 1,interface List{} public class HashSet{}
    说明:T E 只能是引用类型
  • 2,在给泛型指定具体类型后,可以传入该类型或其子类类型
  • 3,泛型使用形式
    List list1 = new ArrayList ();
    List list1 = new ArrayList <>();
    如果我们这样写List list1 = new ArrayList (); 默认他的泛型是 E 就是Object
public class GenericDetail {
    public static void main(String[] args) {
        //1,泛型指向的数据类型是引用类型Integer,不能是基本数据类型int
        List<Integer> list = new ArrayList<Integer>();
        //List<int> list = new ArrayList<int>();  错误

        //2,E指定了A类型,构造器传入 new A()
        //  在给泛型指定具体类型后,可以传入该类型或者子类类型
        Pig<A> aPig = new Pig<A>(new A());
        aPig.f();
        Pig<A> aPig1 = new Pig<A>(new B());
        aPig1.f();

        //3,泛型的使用形式
        List<Integer> list1 = new ArrayList <Integer>();
        //实际开发中往往简写为:
        List<Integer> list2 = new ArrayList <>();

        //4,如果我们这样写List list1 = new ArrayList ();  默认他的泛型是 <E> E 就是Object
        List list3 = new ArrayList ();//等价 ArrayList<Object> arrayList = new ArrayList<Object>();
        
    }
}
class A{

}
class B extends A{}
class Pig<E>{
    E e;

    public Pig(E e) {
        this.e = e;
    }
    public void f(){
        System.out.println("Pig类中的f方法");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv5-7.0改进(二)BiFPN替换Neck网络

前言 针对红绿灯轻量化检测&#xff0c;上一节使用MobileNetv3替换了主干网络&#xff0c;本篇将在使用BiFPN替换Neck的方式优化算法~ 往期回顾 YOLOv5-7.0改进&#xff08;一&#xff09;MobileNetv3替换主干网络 目录 一、BiFPN简介二、改进方法一第一步&#xff1a;在com…

[ES] ElasticSearch节点加入集群失败经历分析主节点选举、ES网络配置 [publish_address不是当前机器ip]

背景 三台CentOS 7.6.1虚拟机&#xff0c; 每台虚拟机上启动一个ElasticSearch 7.17.3&#xff08;下面简称ES&#xff09;实例 即每台虚拟机上一个ES进程&#xff08;每台虚拟机上一个ES节点&#xff09; 情况是&#xff1a; 之前集群是搭建成功的, 但是今天有一个节点一…

unity制作app(6)--服务器保存数据

1.成功将app的所有数据上传到客户端 2.把数据存储到txt文件中&#xff0c;照猫画虎修改create的内容&#xff0c;原内容如下&#xff1a; 写入函数调用的起始位置&#xff1a; 修改后的create内容如下&#xff1a; 3.最终写入文件的内容如下&#xff1a; 4.补充一下结构体的初…

现代制造之Cura切片

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…

i春秋-Test

题目 解题 参考WP https://blog.csdn.net/qq_40654505/article/details/107142533/目录扫描 复现wp payload为&#xff1a; search.php?searchtype5&tid&areaeval($_POST[cmd])使用蚁剑连接 http://eci-2ze4iyhwj7xvb68bsb2t.cloudeci1.ichunqiu.com:80/search.ph…

语义分割——天空图像分割数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

差分约束 C++ 算法例题

差分约束 差分约束 是一种特殊的 n 元一次不等式组&#xff0c;m 个约束条件&#xff0c;可以组成形如下的格式&#xff1a; { x 1 − x 1 ′ ≤ y 1 x 2 − x 2 ′ ≤ y 2 ⋯ x m − x m ′ ≤ y m \begin{cases} x_1-x_1^{} \le y_1 \\ x_2-x_2^{} \le y_2 \\ \cdots \\ x_…

AR人像滤镜SDK解决方案,专业调色,打造个性化风格

视觉内容已成为企业传达品牌价值和吸引用户眼球的重要载体&#xff0c;为满足企业对于高质量、多样化视觉内容的迫切需求&#xff0c;美摄科技凭借先进的AR技术和深厚的图像处理经验&#xff0c;推出了业界领先的AR人像滤镜SDK解决方案。 一、一站式解决方案&#xff0c;覆盖多…

Emacs之取消sh-mode模式下:快捷键C-c C-c(一百三十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

基于单片机的温度控制系统设计(51基础版)-设计说明书

本论文设计了一种基于51单片机的温度控制系统&#xff0c;该系统具备以下主要功能&#xff1a;首先&#xff0c;通过温度传感器实时检测环境温湿度&#xff0c;以获取准确的温度数值。其次&#xff0c;通过按键设置温度阈值&#xff0c;用户可以根据需求自行调整控制温度的上限…

You Only Cache Once:YOCO 基于Decoder-Decoder 的一个新的大语言模型架构

这是微软再5月刚刚发布的一篇论文提出了一种解码器-解码器架构YOCO&#xff0c;因为只缓存一次KV对&#xff0c;所以可以大量的节省内存。 以前的模型都是通过缓存先前计算的键/值向量&#xff0c;可以在当前生成步骤中重用它们。键值(KV)缓存避免了对每个词元再次编码的过程&…

WHAT - CSS Animationtion 动画系列(一)

目录 一、介绍二、animation-name三、animation-duration四、animation-timing-function4.1 介绍4.2 具体实践&#xff1a;抛物线 五、animation-delay六、animation-iteration-count七、animation-direction八、animation-fill-mode九、animation-play-state 今天我们主要学习…

HackMyVM-Minimal

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 gobuster 文件包含漏洞 提权 web信息收集 main方法 question_1 question_2 question_3 prize.txt 软连接 信息收集 arp ┌──(root?0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: E…

中职智慧校园建设内容规划

1. 渠道先行 1) IT根底设施渠道是支撑智慧学校使用体系所必需的运转环境&#xff0c;是首要需求建造的内容&#xff0c;但是要遵从有用准则&#xff0c;IT设备开展很快&#xff0c;更新很快&#xff0c;不要片面追求全而新&#xff1b; 2) 使用根底渠道是支撑智慧学校使用体系作…

SCI一区论文蛇优化器(SO)独家原创改进!适合发表paper!

购买改进/原创算法避坑指南 这会触及很多人的利益&#xff0c;但是不得不发声&#xff0c;教大家避坑&#xff01;因为现在元启发式/群智能算法改进、原创算法市场太乱了&#xff0c;导致产生了很多受害者。 1、增加复杂度的不要买&#xff0c;大家可以叫商家给出运行时间比较…

Java 修饰符

Java 修饰符 Java语言提供了很多修饰符&#xff0c;主要分为以下两类&#xff1a; 访问修饰符 非访问修饰符 修饰符用来定义类、方法或者变量&#xff0c;通常放在语句的最前端。我们通过下面的例子来说明&#xff1a; public class ClassName { // … } private boolean myF…

74从零开始学Java之排序算法中的冒泡和选择排序

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 我们要想成为一个优秀的程序员,其实非常关键的一点就是要锻炼培养自己的编程思维,就好比一个狙击手,要通过大量的射击训练要用大量的子弹喂出来。同样的…

第十三篇:智慧之网:深度探索关系型数据库的数学奥秘与实战技艺

智慧之网&#xff1a;深度探索关系型数据库的数学奥秘与实战技艺 1. 引言 1.1 数据时代的基石 在数字化的浪潮中&#xff0c;数据已成为新时代的石油&#xff0c;而关系型数据库则是这座数据矿藏的精炼厂。自E.F. Codd在1970年提出关系模型以来&#xff0c;关系型数据库以其坚…

新iPadPro是怎样成为苹果史上最薄产品的|Meta发布AI广告工具全家桶| “碾碎一切”,苹果新广告片引争议|生成式AI,苹果倾巢出动

Remini走红背后&#xff1a;AI生图会是第一个超级应用吗&#xff1f;新iPadPro是怎样成为苹果史上最薄产品的生成式AI&#xff0c;苹果倾巢出动Meta发布AI广告工具全家桶&#xff0c;图像文本一键生成解放打工人苹果新iPadPro出货量或达500万台&#xff0c;成中尺寸OLED发展关键…

Zynq开发-使用PYNQ快速入门摄像头MIPI驱动(OV5640)

目录 1. 简介 2. 配置代码 2.1 初始化寄存器 2.2 分辨率寄存器 2.3 白平衡寄存器 2.4 配置寄存器代码 2.5 顶层代码 3. 细节指引 4. 总结 1. 简介 PYNQ是一种基于Python的开发环境&#xff0c;专门设计用于快速、简便地在Xilinx的Zynq平台上进行开发。在《Zynq开发之…